CSV文本文件解析器与TextFieldParser - MalformedLineException

时间:2014-03-10 10:23:27

标签: c# parsing csv

我正在使用C#TextFieldParser类进行CSV解析器。

我的CSV数据由,取消,字符串由"字符括起。

但是,有时数据行单元格也可能有",这似乎使解析器抛出异常。

enter image description here

到目前为止,这是我的C#代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.VisualBasic.FileIO;

namespace CSV_Parser
{
    class Program
    {
        static void Main(string[] args)
        {
            // Init
            string CSV_File = "test.csv";

            // Proceed If File Is Found
            if (File.Exists(CSV_File))
            {
                // Test
                Parse_CSV(CSV_File);
            }

            // Finished
            Console.WriteLine("Press any to exit ...");
            Console.ReadKey();
        }

        static void Parse_CSV(String Filename)
        {
            using (TextFieldParser parser = new TextFieldParser(Filename))
            {
                parser.TextFieldType = FieldType.Delimited;
                parser.SetDelimiters(",");
                parser.TrimWhiteSpace = true;
                while (!parser.EndOfData)
                {
                    string[] fieldRow = parser.ReadFields();
                    foreach (string fieldRowCell in fieldRow)
                    {
                        // todo
                    }
                }
            }
        }
    }
}

这是我的test.csv文件的内容:

" dummy test"s data",   b  ,  c  
d,e,f
gh,ij

在我的行单元格数据中处理"的最佳方法是什么?


更新

根据Tim Schmelter's回答,我已将代码修改为以下内容:

static void Parse_CSV(String Filename)
{
    using (TextFieldParser parser = new TextFieldParser(Filename))
    {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");
        parser.HasFieldsEnclosedInQuotes = false;
        parser.TrimWhiteSpace = true;
        while (parser.PeekChars(1) != null)
        {
            var cleanFieldRowCells = parser.ReadFields().Select(
                f => f.Trim(new[] { ' ', '"' }));

            Console.WriteLine(String.Join(" | ", cleanFieldRowCells));
        }
    }
}

这似乎产生以下(正确):

enter image description here

这是处理用引号括起来的字符串的最佳方法吗?

1 个答案:

答案 0 :(得分:5)

您可以通过将HasFieldsEnclosedInQuotes设置为false来省略引用字符吗?

using (var parser = new TextFieldParser(@"Path"))
{
    parser.HasFieldsEnclosedInQuotes = false;
    parser.Delimiters = new[]{","};
    while(parser.PeekChars(1) != null)
    {
        string[] fields = parser.ReadFields();
    }
}

您可以手动删除引号:

var cleanFields = fields.Select(f => f.Trim(new[]{ ' ', '"' }));