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

有多种可能的解决方法,最简单的方法是逐个字符地逐行下去并自己计算逗号。如果你遇到引号,你可以切换一个布尔值,比如说。bool inQuotes,当inQuotes为真时,您只需忽略逗号。

于 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 回答