2010-03-11 51 views
0

我有一個簡單的應用程序,它打開製表符分隔的文本文件,並將該數據插入到數據庫中。製表符分隔文件中的引號

我使用這個CSV閱讀器來讀取數據:http://www.codeproject.com/KB/database/CsvReader.aspx

而且這是所有工作就好了!

現在我的客戶增加了一個新的領域的文件,該文件是「ClaimDescription」的結束,在其中一些要求的描述,數據在它有引號,例如:

「SUMISEI MARU NO 2「 - 日本海

這似乎是導致我的應用程序的主要頭痛。我收到一個異常,如下所示:

CSV在位置'181'的記錄'1470'字段'26附近似乎已損壞。當前的原始數據:...

並且在「原始數據」中,肯定索賠描述字段顯示帶有引號的數據。

我想知道有沒有人曾經有過這個問題,並且圍繞它? 顯然,我可以要求客戶更改它們最初發送給我的數據,但這是一個自動過程,用於生成製表符分隔的文件;我寧願用它作爲最後的手段。

我在想,我可能會在使用標準TextReader之前打開文件,轉義任何引號,將內容寫回新文件,然後將該文件送入CSV閱讀器。可能值得一提的是這些製表符分隔文件的平均文件大小大約爲40MB。

任何幫助,非常感謝!

乾杯,肖恩

回答

0

沒錯 - 經過深夜的紅牛和抓我的頭後,我最終發現了問題,它是在「Claim_Description」字段中的逗號。甚至沒有想過這個,因爲我使用的是製表符分隔的文件,但只要我找到並替換了文件中的所有逗號,它就工作得非常好!

下一步是瞭解如何在處理之前替換這些逗號。

再次感謝所有的建議。

乾杯,肖恩

2

使用FileHelpers庫,而不是。它被廣泛使用,並將處理引用的字段或包含引號的字段。

+1

看到這 - > http://www.secretgeek.net/csv_trouble.asp – IanL 2010-03-11 14:45:38

+2

@Oded:現在的問題是不問如何應對引號的字段。它詢問包含引號字符的*未加引號的字段。 – LukeH 2010-03-11 14:53:30

+0

@Luke:嗯。我開始不同意你的觀點,因爲沒有真正的CSV「標準」。我確實找到了一個RFC,看起來你是對的。 – 2010-03-11 15:08:04

0

也許你可以用你的應用程序打開這個文件,並用另一個字符替換每個引號,然後處理。

0

我做了一些搜索,並沒有爲CSV文件的RFC(RFC 4180),並沒有明確禁止他們在做什麼:

每個字段可能會或可能不會被包含在雙引號(但是某些程序(如Microsoft Excel)根本不使用雙引號 )。如果字段沒有用雙引號括起來,那麼 雙引號可能不會出現在字段中。

基本上,如果他們想這樣做,他們需要括起整場引號,像這樣:

,""SUMISEI MARU NO 2" - sea of Japan", 

所以,如果你願意,你可以在他們拋出這個問題,背部和堅持他們向您發送「適當的」RFC 4180 CSV文件。

由於您有權訪問該CSV閱讀器的源文件,因此另一個選項是對其進行修改以處理它們提供給您的引用字符串。

這種情況正是爲什麼有源代碼訪問您的工具集至關重要。

如果您想在將文件提交給工具之前對其文件進行預處理(hack),那麼正確的方法是查找不是立即位於分隔符前面或後面的引用字段,並將其整個字段中的另一組引號。

1

我最近解決了類似的問題,雖然CsvReader對所有工作正常,但我的TSV文件,到底什麼解決我的問題的幾行被設置在構造一個customDelimiterCsvReader

public static void ParseTSV(string filepath) 
    { 
     using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) { 
     //if that didn't work, passing unlikely characters into the other params might help 
     //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) { 
      int fieldcount = csvReader.FieldCount; 

      //Does not work, since it's read only property 
      //csvReader.Delimiter = "\t"; 

      string[] headers = csvReader.GetFieldHeaders(); 

      while (csvReader.ReadNextRecord()) { 
       for (int i = 0; i < fieldcount; i++) { 
        string msg = String.Format("{0}\r{1};", headers[i], 
               csvReader[i]); 
        Console.Write(msg); 
       } 
       Console.WriteLine(); 
      } 
     } 
    } 
相關問題