代码之家  ›  专栏  ›  技术社区  ›  Tyler Brock

将csv(行数可变)读取到数据结构中的最佳实践

  •  2
  • Tyler Brock  · 技术社区  · 14 年前

    我正在编写一个小程序,用不同行数的csv读取,并对最佳实践提出问题:

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

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

    …是否有一种智能的方法来判断需要多少空间,比如在手前计算行数,或者使用链接列表动态添加空间,而不是使用静态存储分配的数组。有什么最佳实践吗?我认为选择一个随机数似乎不太明智…

    任何想法都会受到极大的赞赏。

    4 回复  |  直到 9 年前
        1
  •  3
  •   Jay    14 年前

    如果您可以在读取数据时对其进行处理,而不是将其全部保存并在之后进行处理,这将消除问题。

    我避免先计算行数,因为这需要读取整个文件两次。我想,如果文件很小,效率损失就不大,但是如果您知道文件很小,那么您可以分配足够大的空间。

    所以一般来说,我的方法——如果我不能一次处理一行文件——就是使用一个可以增长的数据结构,比如链表。然后为每行分配一个新的块。根据所做的工作,您可能会使用一个动态数组:分配足够的空间来满足正常情况。如果要填充,请分配更大的空间,将第一个空间复制到第二个空间,删除第一个空间,然后继续使用第二个空间。如果你把它填满,重复这个过程。这可能是大量的数据移动,但最终使用的空间量将小于链接列表,因为您没有指针,而且遍历速度更快,因为您没有跟踪指针,可能会在整个虚拟内存中运行。

        2
  •  4
  •   Community CDub    7 年前

    两种最佳实践:

    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++?
        3
  •  3
  •   luiscolorado    14 年前

    实际上没有“最佳实践”。请记住数据的特定结构、读取、存储、查询、排序、查找/消除/忽略重复项等的速度。树、链接列表、哈希、有序数据等是很好的选项,具体取决于我前面提到的因素。

    我同意其他人的观点。不需要重新发明轮子。关于如何解析csv必须有无数的样本。

    但是,在选择您最喜欢的库时,请注意以下几点:

    1. 最佳实践:不要假设数据具有特定的(小的或非常大的)数据量。推论:不要把所有的数据都存储在内存中,只是尽可能地少一些,并且假设不管数组的大小,数据都可能比它大。考虑到这一点,围绕这个假设工作。
    2. 另一个最佳实践:测试角案例(没有输入,非常大的输入,只有一行或元素等)
    3. csv文件不是标准文件。例如,一些生成csv的程序忽略了以下情况:

    3.1。字符串中有逗号。例如,它与史密斯、约翰不同。 3.2。带有字符串的特殊字符,如撇号、制表符或引号。如何处理?例如,Microsoft通常使用双引号来表示字符串中的引号。 3.3。当然,还要注意行尾格式(Unix或Windows样式)。

    一定要看看那些 实际数据 . 永远不要相信用户(也不要相信程序员:—)。

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

        4
  •  1
  •   marr75    14 年前

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

    +在我看来,如果你不想学习很多关于csv解析和csv解析边缘案例的知识,这是日产的粉丝推荐的一个图书馆。