2017-09-19 8 views
0

CSVファイルを取り込み、データテーブル内の最初の列が行カウンタであるデータテーブルにインポートするツールを開発しようとしています。C#:可変構造のCSVファイルを行カウンタ付きのデータテーブルに読み込む

CSVファイルはさまざまな顧客からのもので、構造が異なります。ヘッダ行があるものもあります。いくつかはいくつかのヘッダ行を持っています。一部にはヘッダ行がありません。彼らはまた、さまざまな列を持っています。

これまでのところ、以下のコードがあります。

public void Import_CSV() 
    { 
     OpenFileDialog dialog = new OpenFileDialog(); 
     dialog.Filter = "CSV Files (*.csv)|*.csv"; 
     bool? result = dialog.ShowDialog(); 

     if (result ?? false) 
     { 
      string[] headers; 

      string CSVFilePathName = dialog.FileName; 

      string delimSelect = cboDelimiter.Items.GetItemAt(cboDelimiter.SelectedIndex).ToString(); 

      // If user hasn't selected a delimiter, assume comma 
      if (delimSelect == "") 
      { 
       delimSelect = ","; 
      } 

      string[] delimiterType = new string[] {cboDelimiter.Items.GetItemAt(cboDelimiter.SelectedIndex).ToString()}; 

      DataTable dt = new DataTable(); 

      // Read first line of file to get number of fields and create columns and column numbers in data table 
      using (StreamReader sr1 = new StreamReader(CSVFilePathName)) 
      { 
       headers = sr1.ReadLine().Split(delimiterType, StringSplitOptions.None); 

       //dt.Columns.Add("ROW", typeof(int)); 
       //dt.Columns["ROW"].AutoIncrement = true; 
       //dt.Columns["ROW"].AutoIncrementSeed = 1; 
       //dt.Columns["ROW"].AutoIncrementStep = 1; 

       int colCount = 1; 

       foreach (string header in headers) 
       { 
        dt.Columns.Add("C" + colCount.ToString()); 
        colCount++; 
       } 
      } 

      using (StreamReader sr = new StreamReader(CSVFilePathName)) 
      { 
       while (!sr.EndOfStream) 
       { 
        string[] rows = sr.ReadLine().Split(delimiterType, StringSplitOptions.None); 

        DataRow dr = dt.NewRow(); 

        for (int i = 0; i < headers.Length; i++) 
        { 

          dr[i] = rows[i]; 
        } 

        dt.Rows.Add(dr); 
       } 
      } 

      dtGrid.ItemsSource = dt.DefaultView; 

      txtColCount.Text = dtGrid.Columns.Count.ToString(); 
      txtRowCount.Text = dtGrid.Items.Count.ToString(); 
     } 
    } 

これは、それが(csvファイルにありますどのように多くによるC1、C2 ...)列のヘッダーを作成し、行が中に書かれていると同じくらいで、動作しますが、私は追加したいです左端の列と行番号の行が追加されます。コードでは、オートナンバーの列を作成するコメントアウトされたセクションがあるのがわかりますが、データテーブルに行がどのように書き込まれているか完全にわかっています。そのセクションのコメントを外すと、csvファイルの最初の列がintフィールドに書き込もうとすると、エラーが発生します。各行のどのフィールドをどの列に入れることができるかを指定することができますが、この時点で列が不明なためここでは役立ちません。構造にかかわらず、行カウンタを使用して任意のファイルを読み込むことができるだけです。

希望は意味があります。

答えて

1

最初の列を追加するコードのコメントを解除すると、エラーが発生することがあります。これはループのためです:0から始まりますが、0番目の列は手動で追加した列です。だから、あなたのループでそれをスキップするだけで、1から始める必要があります。しかし、ソース配列は0番目の要素から処理する必要があります。

解決策は次のとおりです。

まず、行追加コードのコメントを外します。

for (int i = 0; i < headers.Length; i++) 
{ 
    dr[i + 1] = rows[i]; 
} 
+0

これは、もう少し説明を行うことができますが、それは正解です:

次に、あなたのループでは、手つかずの最初の列を残すためにオフセットを導入。 – Flater

+0

ちょっとDymanoid、入力のおかげで!そして答え!結局単純です。再度、感謝します。 – Mark

関連する問題