读取csv文件忽略双引号和标题内的逗号

时间:2015-02-06 20:41:52

标签: c#

如何忽略双引号内的逗号和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++;
                        }
                    }
                }

3 个答案:

答案 0 :(得分:3)

来自Microsoft.VisualBasic.dll的{​​{3}}可以帮助满足此要求

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

根据我有限的经验,这个课程不是很快,但是如果不使用需要与应用程序重新分发的外部程序包,就可以使用它。

答案 1 :(得分:0)

我会给你一般伪代码的算法,因为这个问题并不是特定于c#,但它归结为知道你是否在一个开放的双引号内。

  1. 保持一面旗帜,说明你是否在双引号内
  2. 逐个字符地阅读每一行
  3. 当您点击双引号时,只需切换此标志即可反转其值
  4. 当您读取逗号且标志为false时,您可以将当前读取的所有字符转储为当前单元格值,并开始累积为新当前单元格再次读取的字符

答案 2 :(得分:0)

使用

string[] cols = Regex.Split("\"(,\")?")

而不是拆分。

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

RegEx来自我的头脑,所以它可能需要一些调整,但它应该有用......

但是像这样的东西可以完全...使用csv库可能是一个考虑因素......