读取CSV的问题使用包含逗号的字段的引用

时间:2017-06-12 10:05:17

标签: c# csv filehelpers

我的CSV文件标题设置如下:

COMPANY NAME,Email,Job Title,COMPANY TYPE,CITY,FIRSTNAME,LASTNAME

我已经获得了一些代码来读取文件中的记录:

var ofd = new OpenFileDialog();
if (ofd.ShowDialog() != DialogResult.OK) return;
_importFile = ofd.FileName;
Engine = new CsvEngine("record", ',', _importFile);
Records = Engine.ReadFile(_importFile);

此代码对我使用的其他csv文件一直很好,但是当我将其与当前文件一起使用时,我收到此错误:

  

未处理的类型' FileHelpers.BadUsageException'发生在FileHelpers.dll

中      

附加信息:行: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:http://www.filehelpers.net/

4 个答案:

答案 0 :(得分:0)

根据CsvEngine的文档,

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

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

所以,

"Bbc Worldwide Labs, Bounce Republic Ltd",hidden@hidden.com,"Broadcaster, Voice Over & Founder Of Passion Pods",Broadcast Media,London,Emily,Chiswell

将分为以下几部分:

  1. " Bbc Worldwide Labs
  2. Bounce Republic Ltd"
  3. hidden@hidden.com
  4. " Broadcaster
  5. Voice Over& Passion Pods的创始人"
  6. 广播媒体
  7. 伦敦
  8. 艾米丽
  9. 奇斯韦尔
  10. 根据您的标题,这与您的7个字段不匹配。所以,你得到了

      

    Delimiter','在最后一个字段' LASTNAME'之后找到

    因为有','在LASTNAME之后。所以它将伦敦视为LASTNAME

答案 1 :(得分:0)

使用Microsoft.VisualBasic.FileIO程序集,您应该可以执行以下操作:

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

通过跳过标题行来处理标题行

答案 2 :(得分:0)

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

希望它有所帮助。

答案 3 :(得分:0)

您似乎在FileHelpers中发现了一个错误。

试试这段代码:

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

"" Bbc Worldwide Labs,Bounce Republic Ltd"",hidden @ hidden.com,"" Broadcaster,Voice Over& Passion Pods的创始人"",广播媒体,伦敦,EmilyChiswell")

这给出了:

output

正如您所看到的,','的第二个字段可以正常工作。看来错误在于解析第一个字段,如果它有一个逗号。

以下是如何让它发挥作用。

定义导入类:

[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");

它给出了:

output fixed