2012-12-19 29 views
1

我們正在傾銷大量的數據(按照體積而不是頻率),即從數據庫轉儲到Excel文件,即一次轉儲100K或> 400MB記錄。轉儲過程目前正在Python,R和Java中執行(使用POI庫)。作爲轉儲過程的一部分,我們從數據庫讀取數據到中間文件(管道分隔文本文件),然後由代碼拾取更新excel文件。最近,我們遇到了這樣的問題:數據庫中帶有換行符的文本導致管道限制文件無效,因爲1條記錄跨越多行而不是一行。例如,設計中間數據文件的格式?

| Col1 | Col2 | Col3 | 
| Val | Val2 | Val3 | 

是管道分隔文件的有效示例。如果數據包含任何新的線路,然後:

| Col1 | Col2 | Col3 | 
| Val1 


| Val2 | Val3 


| 

這樣的情況下變得難以捕捉並導致更多的編碼則需要爲了使這樣的檢查工作要做。

我想知道是否有任何庫/技術可以用來寫出這樣的臨時數據。我不確定XML是否是一個解決方案,考慮到性能可能成爲如此大量數據的問題。 JSON似乎更適合,但是我不知道我的所有選擇。

+0

我們希望看到來自文件的_actual_(匿名)數據。但總的來說......你可能不得不爲新行字符解析你的文本文件,並用「文本」值替換它們(比如'\ n') - 爲了兼容性原因你可能想要這樣做)。在閱讀器大小上,請注意您的列分隔符,並「忽略」它們之間的任何其他行。我沒有意識到這是非正式的圖書館...... _why_你在做這件事嗎?特別是因爲Excel可以附加到一些數據庫? –

+0

您是否考慮過使用OpenCSV等CSV庫?這通過將它們放在引號中來支持帶逗號的多行字段和字段。 (這是Excel所做的) –

+0

另外,哪些部分分別由Java,Python和R執行?哪些語言正在生成這些數據,哪些正在解析它們,哪些正在執行? – abarnert

回答

2

如果列數始終保證相同,這只是csv的一種奇怪的方言,您應該可以用Python中的csv模塊進行解析,並且我懷疑Java(但可能不是R)在內置或易於使用的庫中具有類似的功能。或者,如果您由於某種原因自己編寫了解析器,則應該很容易將它們擴展爲處理換行符。例如,讀取一條線並拆分|,並假設您已獲取所有字段,請閱讀一條線,拆分|,查看是否有足夠的字段,如果不讀取下一行並追加並嘗試再次。但是,使用已經編寫和測試的代碼,而不是試圖自己破解它的代碼真的更好。

(當然,如果該字段可以包含|字符,那麼這種格式是不明確的,不能被任何東西所解析的,除非你以某種方式逃避它們。)

另一種選擇是隻報價或在一端逃避換行符(和其他特殊字符),並在另一端將它們撤除。再次,這是任何體面的csv庫會爲你做的事情(幾乎是否你想要它)。

而且您可能需要考慮使用準標準csv方言(通常意思是「由Excel的默認值定義」),而不是提供類似但不相同的自定義格式。

使用標準csv方言的一個顯而易見的優點是,Excel可以直接讀取結果,這可能需要從長鏈中取出一層。 (當然,您可以使用Excel的數據訪問功能來導入或導出實際數據庫。)

如果您想要更改爲JSON,則沒有理由不能使用JSON 。但在這裏似乎沒有任何強制性的理由要這樣做。當你有靈活的動態記錄類型時,JSON(或者類似的,比如YAML)肯定是要走的路。但是當你一次又一次地重複使用靜態記錄類型時,JSON意味着一遍又一遍地重複這些字段的名稱。它不像XML那麼糟糕,但它仍然是額外的信息來創建,傳遞和解析,而沒有真正的好處。

所以,我認爲這裏的正確答案是:如果可能的話,Excel風格的csv,如果由於某種原因不可能的話,你自己的獨特的csv方言增加了一條規則來處理換行符。