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

使用c#读取csv文件,不要读取双引号中的逗号,c#,csv,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:

我正在用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#只计算双引号之外的逗号?这真的是我的问题。

不要自己解析CSV——这种格式比大多数人意识到的更难正确解析。您可以使用许多现有的好的CSV解析器


命名空间中有一个库(常规的.NET库)和许多第三方库,这是一个受欢迎的自由选择。

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

您可以使用下面的代码,它对我有效:

  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);
        }

    }

除非你想重新发明轮子,看看这个快速的CSV阅读器:不是一个固执己见的人或任何东西,但你应该尝试清理你的代码(即使只是在你把它发布到StackOverflow的时候)。izuriel现在代码出了什么问题?我愿意接受建议。@Miguel您没有将制表符长度转换为空格(并保持制表符在复制/粘贴代码时的状态),并且基本上缩小了if/else行。我不是说你的代码不好,需要修复,我只是说在这里发布时应该清理格式,我不是建议你应该把代码写得漂亮,除非你愿意,但是为了得到帮助,你可能想让它更干净,格式更好。谢谢你指出这一点。对不起,我真的认为我在这个职位上做得很好。下次我会做得更好。谢谢你的编辑。@EricJ嗯,是的。。。我宁愿解决根本问题,也不愿解决眼前的问题;)有趣的是,我似乎无法将该类添加到我的项目中。如果我尝试此操作,会出现一个错误,显示“错误23命名空间“Microsoft.VisualBasic”中不存在类型或命名空间名称“FileIO”(是否缺少程序集引用?)有什么想法吗?@Miguel-你是如何添加它的?你添加了对
Microsoft.VisualBasic.dll
程序集的引用了吗?@Oded没有,但当我读了你的最后一个注释后,它给了我提示。现在我添加了引用错误。你不会碰巧有一个小例子,用引用的字符串读取csv,是吗@Miguel-该页面上的VB.NET示例应该足以让您开始学习。