3

私はc#を使用してcsvファイルを読んでいます。ここに小さなコードスニペットがあります。

using (StreamReader readFile = new StreamReader("C:\\temp\\" + whichTable))
{
    while ((line = readFile.ReadLine()) != null)
    {
        row = line.Split(',');

        switch (row.Length)
        {
            case 5:
                if (counter == 0) 
                { 
                    break; 
                } 
                else
                {
                    v00.Add(Convert.ToInt32(Regex.Replace(row[0], @"[^\w\.@-]", "")));
                }

                if (row[1] == "") 
                { 
                    v01.Add((1)); 
                }
                else
                {
                    v01.Add(Convert.ToInt32(Regex.Replace(row[1], @"[^\w\.@-]", "")));
                }

                if(row[2]=="")
                {
                    v02.Add(2);
                } 
                else
                {
                    v02.Add(Convert.ToInt32(Regex.Replace(row[2], @"[^\w\.@-]", "")));
                }

                v3.Add(row[4]);
                v4.Add(row[3]);
                counter++;
                break;
        }
        counter++;
    }
    break;
}

私のコードからわかるように、文字列行の長さをテストして、5つが正確に長いことを確認します。私の問題は、csv内にコンマ付きのフィールドがある場合、5以上に計算されることです。私のcsvは整形式であるため、その場合、そのフィールドは二重引用符で囲まれています。C#が二重引用符の外側のコンマのみをカウントするようにするにはどうすればよいですか?それは本当に私の質問です。

4

3 に答える 3

10

CSVを自分で解析しないでください。この形式は、ほとんどの人が理解しているよりも適切に解析するのが困難です。代わりに使用できる既存の優れたCSVパーサーが多数あります。

Microsoft.VisualBasic.FileIO名前空間(通常の.NETライブラリ)に存在するライブラリと、多くのサードパーティ製のTextFieldParserライブラリがあります。FileHelpersは人気のある無料の選択肢です。

于 2012-07-05T20:14:01.923 に答える
2

考えられる回避策は複数ありますが、最も簡単な方法は、行を1文字ずつ下に移動し、自分でコンマを数えることです。引用符が表示された場合は、ブール値を切り替えることができます。bool inQuotes、およびinQuotestrueの場合、コンマは無視します。

于 2012-07-05T20:17:43.043 に答える
0

あなたはこの以下のコードを使うことができます、それは私のために働いています:

  private void ImportCSV(string filePath = @"E:\nucc_taxonomy_140.csv", string tableName = "TempTaxonomyCodes")
    {
        string tempPath = System.IO.Path.GetDirectoryName(filePath);
        string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + tempPath + @"\;Extensions=asc,csv,tab,txt";
        OdbcConnection conn = new OdbcConnection(strConn);
        OdbcDataAdapter da = new OdbcDataAdapter("Select * from " + System.IO.Path.GetFileName(filePath), conn);
        DataTable dt = new DataTable();
        da.Fill(dt);

        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ConfigurationSettings.AppSettings["dbConnectionString"]))
        {
            bulkCopy.DestinationTableName = tableName;
            bulkCopy.BatchSize = 50;
            bulkCopy.WriteToServer(dt);
        }

    }
于 2014-05-31T05:48:55.337 に答える