有哪些“主流”的轻量级备选方案可以替代使用 .csv 格式存储文件?

17

我正在参与一个项目,该项目非常喜欢使用 .csv 文件进行数据存储。我认为使用 .csv 会有许多问题,特别是在存储关系型数据时。解析 .csv 通常很麻烦,尤其是当使用即席列分配时。

我提倡使用 XML 和最小数据库,例如 SQLite,但我正在寻找“更快、更好、更便宜”的替代方案。

还有一些其他的轻量级替代方法可以取代.csv文件吗?

此外,CouchDB 怎么样?在轻量级方面,它与 SQLite 相比如何?

编辑:我错过了。这个问题之前已经有人问过了

5个回答

7
我认为没有直接替代CSV文件的格式。CSV是一个面向索引的扁平文件格式。无论你用管道符还是其他符号代替逗号,都是一样的带有稍微不同规则的东西。
话虽如此,当数据处于我的控制下时,我经常选择SQLite。
始终使用SQLite有利于使用相同的工具,可以用作即席存储器或关系模型,有升级计划到“独立”关系数据库管理系统,提供了DQL“免费使用”的功能(对我来说非常重要),等等。除非空间真的是个问题或者数据访问不支持,为什么不用呢?(现代Firefox也使用SQLite)。
(有很多对象数据库,例如DB4O等,甚至更简单的键/值分层存储等。我并不是要说SQLite是获取微型/嵌入式数据库中关系的唯一方法。)
与XML相比的一个缺点是需要特殊的工具(sqlite/adapter)。XML虽然不是最友好的格式,但在记事本中也可以编辑得很好。此外,在XML中除了标记/数据本身外,没有额外的开销(碎片化或结构),而且XML通常很容易压缩。还有许多库将整个对象图映射到XML(从而保持关系),这可能是个不错的功能。
其他格式如JSON也是可行的--但如果格式是不透明的,那么与XML相比并没有什么区别(这更多地取决于工具支持)。
所以......“这取决于情况”。

4

看起来YAML相对于XML等格式来说比较小,但比JSON稍微更具描述性(它是超集)。这是我考虑的另一个候选项。


3
HDF5是存储大型表格数据集的良好选择,如果您不需要并发写入。在Python中,Pandas + PyTables非常易于使用。来自Pandas 文档的示例:
In [259]: store = HDFStore('store.h5')

In [260]: print(store)
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
Empty
Objects can be written to the file just like adding key-value pairs to a dict:

In [261]: np.random.seed(1234)

In [262]: index = date_range('1/1/2000', periods=8)

In [263]: s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e'])

In [264]: df = DataFrame(randn(8, 3), index=index,
   .....:                columns=['A', 'B', 'C'])
   .....: 

In [265]: wp = Panel(randn(2, 5, 4), items=['Item1', 'Item2'],
   .....:            major_axis=date_range('1/1/2000', periods=5),
   .....:            minor_axis=['A', 'B', 'C', 'D'])
   .....: 

# store.put('s', s) is an equivalent method
In [266]: store['s'] = s

In [267]: store['df'] = df

In [268]: store['wp'] = wp

# the type of stored data
In [269]: store.root.wp._v_attrs.pandas_type
Out[269]: 'wide'

In [270]: store
Out[270]: 
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df            frame        (shape->[8,3])  
/s             series       (shape->[5])    
/wp            wide         (shape->[2,5,4])

3

这一切都与用例有关。

我的经验法则是:如果两个数据之间存在依赖或关系,则使用SQLite;如果只是平面数据文件,则使用CSV(或其他“平面”格式)。最简单的可行解决方案通常也是最可靠的解决方案。

(注意:确保CSV格式正确。没有人喜欢在糟糕的CSV实现中进行操作。)


0

XML被设计为主流和相对“轻量级”。JSON是另一个流行的选择,但更适合对象建模而不是数据存储。

如果您需要关系查询功能,则MySQL是一个好的选择。


6
很多人认为XML非常笨重。JSON的设计就是因为XML过于繁重。 - Jonathan Day
@Jonathan Day:无论是 XML 还是 JSON 更重,取决于你正在做什么。如果你的数据更多或少像 CSV(正如 OP 所述),那么 XML,例如 "<x last="Smith" first="Pat" age="27".../>" 实际上比相应的 JSON {"last":"Smith","first":"Pat""age":27} 更短;并且任何一个都可以用一行代码加载。你可以通过使用普通数组而不是名称来缩短 JSON,但这会降低可读性和错误检查能力(特别是在有很多字段的情况下)--然后你的 JSON 就只是带有方括号而不是换行符的 CSV。 - TextGeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接