使用c#时读取csv文件,不要用双引号读取逗号

时间:2012-07-05 20:11:20

标签: c# csv

我正在使用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;
}

从我的代码中我可以看出我测试字符串行的长度以确保它的五个长度完全正确。我的问题是,如果在csv中有一个带有逗号的字段,那么计算到大于5。我的csv形成良好,所以当发生这种情况时,我确实有一个双字引用的字段。我怎么能告诉c#只计算双引号之外的逗号?这真的是我的问题。

3 个答案:

答案 0 :(得分:10)

不要自己解析CSV - 这种格式比大多数人意识到的要难以解析。您可以使用许多现有的优秀CSV解析器。

TextFieldParser名称空间(常规.NET库)中存在Microsoft.VisualBasic.FileIO库,许多第三方库 - FileHelpers是一种流行的自由选择。

答案 1 :(得分:2)

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

答案 2 :(得分: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);
        }

    }