C# 读取csv文件忽略双引号和标题中的逗号

C# 读取csv文件忽略双引号和标题中的逗号,c#,C#,如何忽略双引号内的逗号和csv头行第一行 string csvData = File.ReadAllText(csvPath); foreach (string row in csvData.Split('\n')) { if (!string.IsNullOrEmpty(row)) { dt.Rows.

如何忽略双引号内的逗号和csv头行第一行

 string csvData = File.ReadAllText(csvPath);
                foreach (string row in csvData.Split('\n'))
                {
                    if (!string.IsNullOrEmpty(row))
                    {
                        dt.Rows.Add();
                        int i = 0;
                        foreach (string cell in row.Split(','))
                        {
                            dt.Rows[dt.Rows.Count - 1][i] = cell;

                            i++;
                        }
                    }
                }

我将给出一般伪代码中的算法,因为这个问题不是c语言特有的,但归根结底是要知道你是否在一个开放的双引号中

保留一面旗帜,上面写着你是否在双引号内 逐字符读取每一行 只要在点击双引号时切换此标志,它就会反转其值 当您读取逗号且标志为false时,您可以转储到当前单元格值为止读取的所有字符,并开始累积为新的当前单元格再次读取的字符 使用

而不是分裂

忽略第一行。使用for循环或foreach中的计数器跳过第一个循环

正则表达式是从我的头顶开始的,所以它可能需要一些调整,但它应该可以工作

但是像这样的事情可能会很复杂。。。使用csv库可能是一个考虑因素…

来自Microsoft.VisualBasic.dll的文件可能有助于满足此要求

using (TextFieldParser MyReader = new TextFieldParser(csvPath))
{
     MyReader.TextFieldType = FieldType.Delimited;
     MyReader.SetDelimiters(",");
     MyReader.HasFieldsEnclosedInQuotes = true;
     string[] currentRow;
     currentRow = MyReader.ReadFields();
     while(!MyReader.EndOfData)
     {
        DataRow row = dt.NewRow();
        currentRow = MyReader.ReadFields();
        for(int i = 0; i < currentRow.Length; i++)
        {
            row[i] = currentRow[i];
        }
        dt.Rows.Add(row); 
     }
 }

根据我有限的经验,这个类的速度不是很快,但这是您可以使用的,而无需使用需要随应用程序重新分发的外部软件包。

找到CSV解析库?您可以使用具有所需功能的TextFieldParser。您也不想使用文件。ReadAllText。。。这里可以找到更好的方法:或者如果你喜欢John Skeet,那么这里是他的方法:正则表达式似乎不起作用,但是,,=?:[^\]*\[^\]*.[^\]*.[^\]*$起作用。尽管在规模上进行评估非常缓慢。
using (TextFieldParser MyReader = new TextFieldParser(csvPath))
{
     MyReader.TextFieldType = FieldType.Delimited;
     MyReader.SetDelimiters(",");
     MyReader.HasFieldsEnclosedInQuotes = true;
     string[] currentRow;
     currentRow = MyReader.ReadFields();
     while(!MyReader.EndOfData)
     {
        DataRow row = dt.NewRow();
        currentRow = MyReader.ReadFields();
        for(int i = 0; i < currentRow.Length; i++)
        {
            row[i] = currentRow[i];
        }
        dt.Rows.Add(row); 
     }
 }