2013-03-26 47 views
0

在使用SQL Server Bulk insert of CSV file with inconsistent quotes(CsvToOtherDelimiter選項)作爲我的基礎之後,我發現了RemoveCSVQuotes部分的一些奇怪之處[它將包含逗號的引用字符串中的最後一個字符切碎]。所以..重寫了這一點(也許是一個錯誤?)字符串處理/ CSV挑戰

一個問題是,客戶已經問過'這樣的數據怎麼樣?'

""17.5179C,"" 

我想,如果我想使用CsvToOtherDelimiter解決方案,以保持,我不得不修改正則表達式...但它遠遠超出我...什麼是最好的方法呢?

澄清:在使用格式文件運行批量插入之前,我們使用C#將文件預處理爲管道分隔格式。速度非常重要。

回答

0

要將CSV字符串轉換爲元素列表,您可以編寫一個程序來跟蹤狀態(使用引號或引號外),因爲它一次處理字符串一個字符,併發出找到的元素。 CSV中的報價規則是weird,因此您需要確保您有足夠的測試數據。

狀態機可以是這樣的:

  1. 掃描直到報價(到2)或逗號(去3)
  2. 如果下一個字符是一個報價,只添加兩個中的一個引用字段並返回1.否則,轉到4(如果引用不是字段中的第一個字符,則報告錯誤)。
  3. 發出場,去1個
  4. 掃描直到引號(去5)
  5. 如果下一個字符是一個報價,只添加兩個引號領域之一,並返回到4。否則,發出現場,掃描一個逗號,並轉到1

這應該正確掃描東西,如:

  • 你好,世界,123,456
  • 的 「Hello World」,123,456
  • 「他說:‘’你好,世界!」,「」,「和我打了個招呼」
  • 「」 17.5179C「」(正確地報告錯誤,因爲應該是第一個帶引號的字符串之間的分隔符 「」和第二個字段 17.5179C)。

另一種方法是找到一些現有的庫,它可以做得很好。當然,CSV很普遍,這樣的事情一定存在?

編輯:

你提到的速度是至關重要的,所以我想指出的是,(只要是不允許帶引號的字符串包括線路返回...)每行可以獨立於被處理平行。

+0

我將不得不確認,但我認爲客戶需要在數據庫上以「17.5179C」結尾「17.5179C」。 – kpollock 2013-03-26 16:43:29

+0

由於有很多變種,這可能對您的客戶有意義。我建議你得到一個清晰的規格(或者至少有很多他們想要的例子)。應該很容易適應我放在那裏的算法使用「」作爲分隔符來引用字符串而不是「。 – redtuna 2013-03-26 16:47:11

+0

@kpollock或者你可以使用.NET框架中內置的CSV解析器(http://msdn.microsoft .com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx),並在第一時間做對。 – Tergiver 2013-03-26 18:33:56

0

從你的鏈接接受的答案始於:

你將需要預處理的文件,期。

爲什麼不將您的csv轉換爲xml?然後,您將能夠在存儲到數據庫之前,根據xsd驗證您的數據。

0

我結束了使用csv解析器,我不知道我們已經(作爲我們的代碼生成工具的一部分) - 並注意到「」17.5179C,「」是無效的,將導致錯誤。