2017-06-12 28 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