2010-08-05 67 views
0

我需要將易於解析的數據存儲在文件中,作爲數據庫支持解決方案的替代方案(不用於辯論)。由於要存儲大量數據,因此最好使用輕量級語法。這不一定需要人類可讀,但應該可以解析。請注意,將是多種類型的字段/列的,可以使用其中的一些,而另一些不會高效地將可解析的數據存儲在文件中?

從我有限的經驗沒有一個數據庫中,我看到幾個選項,所有的問題

  • CSV - 我可以在技術上做到這一點,它非常輕。然而,解析將是一個問題,然後它會吸如果我想添加一列。多語言支持是可能的,主要是人們自己的定製解析器
  • XML - 這是從許多方面完美的解決方案,除非涉及解析和開銷。這是很多標籤,並會產生一個巨大的文件,解析將是非常耗費資源。然而事實上每種語言都支持XML
  • JSON - 這是一箇中間立場,但我不想這麼做,因爲它的尷尬語法和解析不是微不足道的。語言支持是可能的。

所以都有它們的缺點。但是,當試圖瞄準語言支持並且文件大小有點小時,最好是什麼?

回答

1

如果你只是使用所有這些格式的基礎知識,所有的解析器都是微不足道的。如果CSV是一個選項,那麼對於XML和JSON,您正在討論名稱/值對的塊,因此甚至不涉及遞歸結構。 json.org幾乎支持任何語言。

這就是說。

我沒有看到什麼問題與CSV。如果人們寫錯誤的解析器,那就太糟糕了。如果您擔心兼容性問題,請從Excel中採用默認的CSV模型。任何不能從Excel解析CSV的人都不會在這個世界上走得太遠。您在CSV中找到的最弱支持是嵌入換行符和回車符。如果你的數據沒有這個,那麼這不是問題。只有其他問題是嵌入式引用,並且它們以CSV格式轉義。如果你還沒有這些,那麼它更加微不足道。

至於「添加一列」,你有所有這些問題。如果添加一列,則會重寫整個文件。我不認爲這是一個大問題。

如果您關心的是空間,CSV是最緊湊的,其次是JSON,其次是XML。沒有一個結果文件可以輕鬆更新。他們幾乎都需要重寫數據的任何變化。由於CSV沒有關閉元素(如JSON和XML),因此CSV具有易於追加的優點。

+0

如果我使用XML,我可以只添加一個新的標籤添加元素。我忘記了那個CSV可以導入到excel電子表格中。 – TheLQ 2010-08-05 17:22:38

+0

然後你的XML不符合。從理論上講,一個XML文件是一個單一的元素,可能有一百萬個這樣的子元素。並不是說它不能完成,而是有人這樣做,只是說你最終得到的是一個包含多個XML元素的文件,而不是一個符合XML文檔的文件。 – 2010-08-05 19:02:47

+0

模式 T TheLQ 2010-08-06 04:23:28

3

sqlite怎麼樣?這將允許您基本上將「DB」嵌入到您的應用程序中,但不需要單獨的DB後端。另外,如果你以後最終使用數據庫後端,它應該相當容易切換。

如果這不合適,我會建議其中一個用於鍵值查找的DBM類商店,如Berkely DB或tdb。

+0

SQLite是一種選擇,但我真的想平面文件存儲,而不只是一個數據庫文件中的 – TheLQ 2010-08-05 17:20:45

0

JSON可能是你最好的選擇(它是輕微的,更快的解析和自我描述,所以你可以隨着時間的推移添加新的列)。你說過可分析 - 你的意思是使用Java? Java的JSON庫可以消除大部分工作中的痛苦。此外,還有各種輕質內存數據庫能夠堅持到一個文件(萬一「不是一種選擇」意味着你不想要一個大的單獨的數據庫)

0

如果這只是記錄一些數據迅速給文件,我發現製表符分隔的文件比CSV更容易解析,所以如果它是一個你想要的平面文本文件,我會去那裏(只要你沒有標籤在飼料當然)。如果您有固定大小的列,則可以使用固定長度的字段。這更快,因爲你可以尋求。

如果它可能需要一些分析非結構化數據,我會去JSON。

如果它是結構化數據和你設想過做任何查詢就可以了......我會使用SQLite去。

+0

當您添加比列的其餘部分長一個字符的行時,製表符分隔似乎很可怕。數據中可能有選項卡。 – TheLQ 2010-08-05 17:29:48

0

當我需要這樣的解決方案時,我寫了一個簡單的以長度爲前綴的數據表示。例如,「Hi」將表示爲(十六進制)02 48 69
爲了形成行只是巢此操作(第一個數字是字段數,然後將字段),例如,如果字段0包含「喜」和字段1包含「ABC」,那麼這將是:

 
Num of fields Field Length Data Field Length Data 
02    02    48 69 03    61 62 63 

您也可以使用第一行作爲列的名稱。 (我不得不說這是一種DB後端)。

0

您可以使用CSV,如果您只在最後添加列,這很容易處理。即如果列數少於預期,則使用「缺少」字段的默認值。

如果你希望能夠改變順序/使用的字段,您可以添加標題行。即第一行具有列的名稱。當您嘗試讀取數據時,這可能很有用。

+0

所以我會在每行的末尾有3-4個空白列? – TheLQ 2010-08-05 17:27:59

+0

我建議解析器假設,如果它試圖讀取不存在的字段,它們將被視爲空白。 – 2010-08-05 20:57:41

0

如果您被迫使用平面文件,爲什麼不開發自己的格式?您應該能夠調整開銷並儘可能多地進行自定義(如果您正在解析大量數據,這很有用)。 數據條目將是固定長度或可變長度,將某些條目強制爲固定長度有好處,但您需要創建一個用於分隔兩者的方法。如果您有不同的「類型」行,請將每種類型的所有行寫入一個塊中。每個行塊都會有一個標題。使用一個頭來描述塊的類型,另一個頭來描述列和它們的大小。確定您將如何使用標題來描述每個塊。

如(H爲頭,C是列描述和d是數據錄入):

H Phone Numbers 
C num(10) type 
D 1234567890 Home 
D 2223334444 Cell 

H Addresses 
C house(5) street postal(6) province 
D 1234_ "some street" N1G5K6 Ontario 
+0

這是我猜想的,但我正在尋找一個標準的存儲位置 – TheLQ 2010-08-05 17:27:29

0

我會說,如果你想存儲的行和列,你必須使用D B。原因很簡單 - 使用除RDBMS以外的任何方法修改結構都需要付出很大的努力,並且您提到將來需要更改結構。

相關問題