データテーブルにcsvをロードしましたが、空白でないときに空白として読み込まれている列があります。私は当初ヘッダーに問題があっただけでしたが、私は今でもデータの行にこの問題を見ていますので、私は再確認する必要があります。私のデータセットの問題は何ですか?ブランク?C#がデータテーブル不足列にロードされました
現在、この設定では、1〜7列のデータが読み込まれます(8〜10は必要ありません)。不思議なことに、私は2つのファイルを持っています。どちらも構造は似ていますが、そのうちの1つはカラム4に値を持ち、もう1つは値を持っていません。完全なコードは、多くのファイルをループしてデータの開始と終了をチェックし、SQL Serverにロードするように設定されています。
サンプルCSV:
By OrgID/Location
As of: December 6, 2017 at 10:13 AM
Date Range: summaryYM 2017M08 to 2017M08
"orgid=13778 medType=' '"
"col1","col2","col3","col4","col5","col6","col7","col8","col9","col10"
13778,140242,"2A","2017M08",0,0.058,78,".",".",
13778,140242,"2B","2017M08",0,0.014,19,".",".",
13778,140242,"2C","2017M08",0,0.083,133,".",".",
13778,140242,"2ICU","2017M08",0,0.099,114,".",".",
13778,140242,"3 ICU","2017M08",0,0.076,88,".",".",
コード
//open connection to csv
string connStrCsv = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=NO;FMT=Delimited"""
, Path.GetDirectoryName(file));
OleDbConnection connCsv = new OleDbConnection(connStrCsv);
connCsv.Open();
//store csv data in datatable
string readCsv = "select * from [" + Path.GetFileName(file) + "]";
OleDbDataAdapter adapter = new OleDbDataAdapter(readCsv, connCsv);
DataSet ds = new DataSet();
adapter.Fill(ds, "sheet1");
DataTable table = ds.Tables["sheet1"];
connCsv.Close();
//find header to define start of data
int start = 0;
StreamReader headerSearch = null;
int incr = 0;
headerSearch = new StreamReader(file);
while (!headerSearch.EndOfStream)
{
incr++;
string line = headerSearch.ReadLine();
if (line.Contains("\"col1\",\"col2\",\"col3\",\"col4\",\"col5\",\"col6\""))
{
start = incr;
}
}
headerSearch.Close();
//load each row of excel into SQL server until first empty row
string sqlConnStr = "Data Source=mysource;Initial Catalog=mydatabase;Trusted_Connection=Yes;Integrated Security=SSPI;";
SqlConnection connSql = new SqlConnection(sqlConnStr);
connSql.Open();
int end = start;
while (table.Rows[end][0].ToString().Length != 0)
{
string sql = string.Format
(@"
delete from schema.table
where ss_col1 = {0}
and ss_col2 = '{1}'
and ss_col3 = '{2}'
and ss_col4 = '{3}';
insert into schema.table
values ({4}
,'{5}'
,'{6}'
,'{7}'
, {8}
,'{9}'
,'{10}'
,getdate()
,user_name()
,getdate()
,user_name());"
//delete statement variables
, table.Rows[end][0].ToString()
, table.Rows[end][2].ToString()
, table.Rows[end][3].ToString()
, infTypes[i]
//insert statement variables
, table.Rows[end][0].ToString()
, table.Rows[end][2].ToString()
, table.Rows[end][3].ToString()
, infTypes[i]
, table.Rows[end][4]
, table.Rows[end][5].ToString()
, table.Rows[end][6]
);
SqlCommand execSql = new SqlCommand(sql, connSql);
execSql.ExecuteNonQuery();
end++;
}
connSql.Close();
「ごみ」はどこから来ているを見つけるとそれを修正します。 –
空の列を確認するには、 'if(row [4] .ToString()==" "&& row [5] .ToString()==" "&& row [6] .ToString()== "" && row [7] .ToString()== ""){//次にcols 4-7は空白です} 'ここで何か不足している場合を除きます。私はOleDBに精通していませんが、このコードサンプルでは、データはCSVファイルからではなく実際にそこから来ています(元々はCSVから来たものでも)。必要に応じてデータベース制約を使用して、迷惑データがそこに巻き込まれるのを防ぐことができます。 –
これまでのご返答いただきありがとうございます、私は自分自身をはっきり説明していないようです。 ファイルは私が制御できない外部ソースから来ているので、私はガベージを修正することはできません。そして、約200行がcsvにあります。そのうち30行だけが必要なデータを持っていますが、ガベージの量が変わるため、30行がすべてのファイルで変更されます。 4〜7桁の空白の列にはデータが含まれている必要があります。文字列にマッチするように、それぞれの列1-7が必要です。 – mia