2017-06-12 29 views
0

我的CSV文件头都设置了这样的领域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文件,但是当我与我目前的文件中使用它,我得到这个错误:

An unhandled exception of type 'FileHelpers.BadUsageException' occurred in FileHelpers.dll

Additional information: Line: 180 Column: 149. Delimiter ',' found after the last field 'LASTNAME' (the file is wrong or you need to add a field to the record class)

这是有问题的记录,在线180:

"Bbc Worldwide Labs, Bounce Republic Ltd",[email protected],"Broadcaster, Voice Over & Founder Of Passion Pods",Broadcast Media,London,Emily,Chiswell 

此记录给定字段标题匹配。所以有什么问题?

我可以想象导致这个问题的唯一的事情是在其他领域内给予的逗号。但他们封装了引用,所以这不应该是一个问题,对吧?

编辑

我使用FileHelpers库来解析CSV:http://www.filehelpers.net/

+1

这CsvEngine - 你自己做它或者是一些第三方? – pitersmx

+1

最可能的答案是'CsvEngine'不理解带引号的字段。您可能想要选择其中一个正确处理它们的CSV阅读器。 –

+0

我正在使用FileHelpers:http://www.filehelpers.net/ – ThePerplexedOne

回答

0

为每CsvEngine文档,

构造函数只有一个分隔符是','

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

所以,

"Bbc Worldwide Labs, Bounce Republic Ltd",[email protected],"Broadcaster, Voice Over & Founder Of Passion Pods",Broadcast Media,London,Emily,Chiswell 

将被分成以下:

  1. “BBC环球实验室
  2. 弹跳共和国有限公司”
  3. [email protected]
  4. “播音员
  5. 配音&方正激情荚”
  6. 广播媒体
  7. 伦敦
  8. 艾米莉
  9. 奇斯韦尔

不与你的7个领域,按您的报头相匹配。所以,你越来越

Delimiter ',' found after the last field 'LASTNAME'

因为在LASTNAME之后有','。所以它正在考虑伦敦作为姓氏

+0

好的,但这不是我的问题的解决方案。 – ThePerplexedOne

+0

.NET TextFieldParser(.NET Framework的一部分)应该能够处理这个问题。 – nabuchodonossor

+0

使用'',''不是一个选项。由于您正在使用第三方库,请更改您的分隔符或删除其他字段中的逗号。 – Abhishek

0

使用Microsoft.VisualBasic。FileIO专注大会,你应该能够做这样的事情:通过跳过头线(S)

0

使用Cinchoo ETL(在GitHub上的开源库)的标题行

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

照顾,你可以加载您的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); 
} 

希望它有帮助。

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,[email protected],""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell 

“” BBC环球实验室,弹跳共和国有限公司 “”,[email protected] “” 播音员,配音&方正激情荚 “”,广播媒体,伦敦,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,[email protected],""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell 
""Bbc Worldwide Labs, Bounce Republic Ltd"",[email protected],""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell"); 

它提供:

output fixed

+0

这很棒,但我无法为csv定义类,因为字段名称一直在变化。每次都是不同的csv文件。 – ThePerplexedOne