2017-11-28 19 views
0

データテーブルに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(); 
+1

「ごみ」はどこから来ているを見つけるとそれを修正します。 –

+0

空の列を確認するには、 'if(row [4] .ToString()==" "&& row [5] .ToString()==" "&& row [6] .ToString()== "" && row [7] .ToString()== ""){//次にcols 4-7は空白です} 'ここで何か不足している場合を除きます。私はOleDBに精通していませんが、このコードサンプルでは、​​データはCSVファイルからではなく実際にそこから来ています(元々はCSVから来たものでも)。必要に応じてデータベース制約を使用して、迷惑データがそこに巻き込まれるのを防ぐことができます。 –

+0

これまでのご返答いただきありがとうございます、私は自分自身をはっきり説明していないようです。 ファイルは私が制御できない外部ソースから来ているので、私はガベージを修正することはできません。そして、約200行がcsvにあります。そのうち30行だけが必要なデータを持っていますが、ガベージの量が変わるため、30行がすべてのファイルで変更されます。 4〜7桁の空白の列にはデータが含まれている必要があります。文字列にマッチするように、それぞれの列1-7が必要です。 – mia

答えて

1

は、あなたがデータテーブルにロードする必要がありますか? "header1"、 "header2"、 "header3"、 "header4"、 "header5"、 "header6"がユニークであれば、それらを見つけるまでcsvファイルを読むのは簡単ではないでしょうか?

例...

StreamReader Reader = null; 
string FilePath = "Your File Path"; 
try 
{ 
    Reader = new StreamReader(FilePath); 
    while(Reader.Peek() > 0) 
    { 
    string line = Reader.ReadLine(); 
    bool HeaderFound = false; 
    if(line == "What ever your headers are") 
    { 
     HeaderFound = true; 
    } 
    if(HeaderFound) 
    { 
     //Here is all your data you were looking for. 
    //Do whatever you need to do with it now. 
    } 
    } 
} catch(exception e) 
{/*Deal with the issues*/} 
finally 
{ 
    if(Reader != null) 
    { 
    Reader.Close(); 
    Reader.Dispose(); 
    } 
} 
+0

あなたの提案をありがとう。ヘッダーの最初の問題はストリームリーダーを使用して解決されましたが、csvが変更された後、データセットで同じ問題が発生しました。私は今質問を再開し、データセットアダプターの解決策を得ることを望んでいます。ストリームリーダーとスプリットステートメントを使用してredevするのではなく、テクニックを満たしてください。 – mia

+0

Microsoftの組み込みデータセットアダプタは、正確にどのように動作するのかという謎です。そのため、いくつかの列が欠落していました。したがって、このstreamreaderオプションは、自分のcsvで何が起こっているのかを制御して知る唯一の方法です。私は最終的にこのストリームリーダとスプリットオプションを使用しなければならなくなりました - はるかに再開発されたとは言えませんでした。 – mia

関連する問題