C# 读取对包含逗号的字段使用引号的CSV时出现问题

C# 读取对包含逗号的字段使用引号的CSV时出现问题,c#,csv,filehelpers,C#,Csv,Filehelpers,我的CSV文件头设置如下: COMPANY NAME,Email,Job Title,COMPANY TYPE,CITY,FIRSTNAME,LASTNAME using (TextFieldParser parser = new TextFieldParser("yourfile")) { parser.TextFieldType = FieldType.Delimited; parser.HasFieldsEn

我的CSV文件头设置如下:

COMPANY NAME,Email,Job Title,COMPANY TYPE,CITY,FIRSTNAME,LASTNAME
        using (TextFieldParser parser = new TextFieldParser("yourfile"))
        {
            parser.TextFieldType = FieldType.Delimited;
            parser.HasFieldsEnclosedInQuotes = true;
            parser.SetDelimiters(",");
            while (!parser.EndOfData)
            {
                //Process row
                string[] fields = parser.ReadFields();
                foreach (string field in fields)
                {
                    //TODO: Process field
                }
            }
        }
我有一些代码来读取文件中的记录:

var ofd = new OpenFileDialog();
if (ofd.ShowDialog() != DialogResult.OK) return;
_importFile = ofd.FileName;
Engine = new CsvEngine("record", ',', _importFile);
Records = Engine.ReadFile(_importFile);
这段代码在我使用过的其他csv文件中运行良好,但当我在当前文件中使用它时,会出现以下错误:

FileHelpers.dll中发生类型为“FileHelpers.BadUsageException”的未处理异常

其他信息:行:180列:149。在最后一个字段“LASTNAME”之后找到分隔符“,”(文件错误或需要向记录类添加字段)

这是第180行的记录:

"Bbc Worldwide Labs, Bounce Republic Ltd",hidden@hidden.com,"Broadcaster, Voice Over & Founder Of Passion Pods",Broadcast Media,London,Emily,Chiswell
此记录与给定的字段标题匹配。那有什么问题

我能想象的唯一导致这个问题的原因是其他字段中的逗号。但它们都有引文,所以这不应该是个问题,对吧

编辑


我正在使用FileHelpers库解析CSV:

根据的文档

构造函数只接受一个分隔符,即
,'

由于在其他字段中有逗号,因此它们也被视为分隔符,并且该行将被拆分为所有
'、
字符

所以

将分为以下几部分:

  • Bbc全球实验室
  • 弹跳共和国有限公司”
  • hidden@hidden.com
  • “广播员
  • 画外音&激情播客的创始人”
  • 广播媒体
  • 伦敦
  • 艾米丽
  • 奇斯韦尔
  • 与标题中的7个字段不匹配。所以,你得到了

    在最后一个字段“LASTNAME”后找到分隔符“”


    因为姓氏后面有“,”。因此,考虑使用Microsoft.VisualBasic.FileIO程序集将伦敦作为LASTNAME

    ,您应该能够执行以下操作:

    COMPANY NAME,Email,Job Title,COMPANY TYPE,CITY,FIRSTNAME,LASTNAME
    
            using (TextFieldParser parser = new TextFieldParser("yourfile"))
            {
                parser.TextFieldType = FieldType.Delimited;
                parser.HasFieldsEnclosedInQuotes = true;
                parser.SetDelimiters(",");
                while (!parser.EndOfData)
                {
                    //Process row
                    string[] fields = parser.ReadFields();
                    foreach (string field in fields)
                    {
                        //TODO: Process field
                    }
                }
            }
    
    通过使用Cinchoo ETL(GitHub的一个开源库)跳过标题行,您可以加载CSV文件

    COMPANY NAME, Email, Job Title,COMPANY TYPE, CITY, FIRSTNAME, LASTNAME
    "Bbc Worldwide Labs, Bounce Republic Ltd",hidden @hidden.com,"Broadcaster, Voice Over & Founder Of Passion Pods", Broadcast Media, London, Emily, Chiswell
    
    解析上述文件的过程如下所示

    foreach (dynamic rec in new ChoCSVReader("EmpQuote.csv").WithFirstLineHeader())
    {
        Console.WriteLine(rec.COMPANY_NAME);
        Console.WriteLine(rec.COMPANY_TYPE);
    }
    

    希望有帮助。

    您似乎在FileHelpers中发现了一个bug

    请尝试以下代码:

    var co = new FileHelpers.Options.CsvOptions("Output", ',', 7);
    co.HeaderLines = 0;
    var ce = new FileHelpers.CsvEngine(co);
    var output = ce.ReadString(@"Bbc Worldwide Labs Bounce Republic Ltd,hidden@hidden.com,""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell
    
    “英国广播公司全球实验室,弹跳共和国有限公司”,hidden@hidden.com,“激情播客的播音员、配音和创始人”,广播媒体,伦敦,埃米利基斯韦尔)

    这就产生了:

    正如您看到的第二个字段带有“
    ”,“
    工作正常。如果第一个字段有逗号,则分析该字段时出现错误


    下面是如何让它工作

    定义导入类:

    [FileHelpers.DelimitedRecord(",")]
    public class Orders
    {
        [FileHelpers.FieldQuoted]
        public string CompanyName;
        public string Email;
        [FileHelpers.FieldQuoted]
        public string JobTitle;
        public string CompanyType;
        public string City;
        public string FirstName;
        public string LastName; 
    }
    
    现在,该代码起作用了:

        var ce = new FileHelpers.FileHelperEngine<Orders>();
    
        var output = ce.ReadString(@"Bbc Worldwide Labs Bounce Republic Ltd,hidden@hidden.com,""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell
    ""Bbc Worldwide Labs, Bounce Republic Ltd"",hidden@hidden.com,""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell");
    
    var ce=new FileHelpers.FileHelperEngine();
    var output=ce.ReadString(@“英国广播公司环球实验室弹跳共和国有限公司,hidden@hidden.com,“播音员、画外音和激情播客创始人”,广播媒体,伦敦,艾米丽,奇斯韦尔
    “英国广播公司全球实验室,弹跳共和国有限公司”,hidden@hidden.com,“激情播客的播音员、配音和创始人”,广播媒体,伦敦,艾米丽,奇斯韦尔);
    
    它给出:


    这个CSV引擎-是你自己做的还是第三方做的?最有可能的答案是,
    CSV引擎
    不理解引用的字段。你可能想从许多其他CSV阅读器中选择一个能够正确处理它们的。我使用的是文件帮助程序:否决什么?我的问题不够清楚吗?@Theerplexedone,你使用的是ird party library声称能够读取csv,但无法处理包含分隔符的引用文本,这是规范的一部分。我建议更改为能够处理此类内容的库。好的,但这不是我问题的解决方案。NET TextFieldParser(.NET Framework的一部分)应该能够处理这个问题。使用
    ,“
    不是一个选项。因为您使用的是第三方库,请更改您的分隔符,或者删除其他字段中的逗号。这很好,但我无法为csv定义类,因为字段名总是在更改。每次都是不同的csv文件。