将csv(具有可变行数)读入数据结构的最佳实践

时间:2010-08-16 21:02:52

标签: c csv data-structures

我正在编写一个小程序来读取具有可变行数的csv,并对最佳实践提出疑问:

是为每行上的数据创建存储的最佳方法,以创建一个包含csv数据结构的数组(每个csv行一个)?

分配给数组的大小可以设置为大数(例如,比csv中合理的行数多)? 我在网上的许多例子中看到了这一点。

...是否有一种聪明的方法可以告诉您需要多少空间,例如事先计算行数或使用链接列表动态添加空间而不是使用静态存储分配。任何最佳做法?我不认为选择随机数看起来很光滑......

任何想法都将不胜感激。

4 个答案:

答案 0 :(得分:4)

两个最佳实践:

  1. 永远不要指望外界的输入能够纠正。
  2. 使其成为事务性(全部导入或回滚)
  3. 如果可能,请利用第三方API或类似http://www.codeproject.com/KB/database/CsvReader.aspx或此http://sourceforge.net/projects/javacsv/的库来大大减少重新发明轮子。如果您坚持使用C并且可以做C ++,请考虑这种方法:How can I read and manipulate CSV file data in C++?

答案 1 :(得分:3)

真的没有“最佳实践”。请记住数据的特定结构,读取它的速度,存储,查询,排序,查找/消除/忽略重复等等。树,链表,散列,有序数据等根据我已经提到的因素,这是很好的选择。

我同意其他人的意见。无需重新发明轮子。必须有大量关于如何解析CSV的样本。

但是,在选择自己喜欢的图书馆时,请注意以下几点:

  1. 最佳实践:永远不要假设数据具有特定(小或非常大)的数据量。推论:不要将所有数据存储在内存中,只要尽可能合理,并假设无论数组的大小如何,数据都可能比它大。考虑到这一点,可以解决这个问题。
  2. 另一个最佳实践:测试角落案例(无输入,非常大的输入,只有一行或元素等)
  3. CSV文件不是标准文件。例如,某些生成CSV的程序会忽略以下情况:
  4. 3.1。字符串中的逗号。例如,与史密斯,约翰不同,“史密斯,约翰”不一样。 3.2。包含字符串的特殊字符,例如撇号,制表符或引号。他们是如何处理的?例如,Microsoft通常使用双引号来表示字符串中的引号。 3.3。当然,要小心行尾格式(Unix或Windows风格)。

    请务必查看非常好的实际数据。永远不要相信用户(也不是程序员: - )。

    祝你好运。路易斯。 Excel和Visual Basic用于生成

答案 2 :(得分:3)

如果您可以在阅读时处理数据而不是保存所有数据并在之后进行处理,这将消除此问题。

我首先避免计算行数,因为这需要读取整个文件两次。我想如果文件很小,效率命中并不是什么大问题,但是如果你知道文件很小,那么你可以分配足够大的空间。

所以一般来说,我的方法 - 如果我不能一次处理一行文件 - 是使用可以增长的数据结构,就像链表一样。然后,对于每一行,我只分配一个新块。根据您的需要,您可以使用动态数组:为正常情况分配足够的空间量。如果填写它,请分配更大的空间,将第一个复制到第二个,删除第一个,然后继续使用第二个。如果填写,请重复此过程。这可能是大量的数据移动,但最终使用的空间量将少于链表,因为你没有指针,并且遍历会更快,因为你没有追逐指针并且可能正在运行遍布虚拟内存。

答案 3 :(得分:1)

使用库或预先计算行数。您还可以使用某种列表数据结构,以避免担心行数。

+1给Nissan Fan推荐图书馆,在我看来,除非你想学习很多关于CSV解析和CSV解析边缘情况的知识,否则这总是可行的。