【问题标题】:Counting number of lines in CSV file without loading into memory计算 CSV 文件中的行数而不加载到内存中
【发布时间】:2013-04-01 19:15:07
【问题描述】:

我有一个非常大的 CSV 文件,大约有 50k+ 行。我使用 CHCSVParser 逐行解析它,效果很好。

我想在数据被解析并添加到 CoreData 时向用户显示某种类型的进度。如果我知道行数,我可以只显示 numLinesParsed/totalLines。我想知道是否有一种快速的方法来计算 CSV 文件中的行数,而无需:

  1. 将其全部加载到内存中
  2. 需要几秒钟以上

我不知道我是否应该尝试做这个 Objective C 或者直接用 C 做会更好。

【问题讨论】:

  • 批量读取文件怎么样?
  • @AnoopVaidya 它似乎效率低下,因为如果我分批阅读它,我还不如解析它。我不知道是否有一些超级秘密的方法来做类似“file.numberOfLines”之类的事情。
  • 你总是可以使用 (bytes_processed/size_of_file)*100,也许不是你想要的,但至少用户知道需要多长时间。
  • 你可以通过文件查找,检查nsfilehandler /nsfilemanager
  • 仅供参考,对于 C 标准,文件只是一个字节序列。除非您查看它们,否则它不“知道”这些字节中有多少是换行符。因此,您唯一的希望是 iOS 是否保留某种额外的文件元数据,可能包括换行符的数量作为内容摘要的一部分。我对 iOS 的了解还不足以排除这种可能性,但这似乎不太可能。另请注意,您可能可以小块读取文件并在不到“几秒钟”的时间内扫描换行符,但这取决于行的长度。

标签: objective-c c parsing csv file-io


【解决方案1】:

为什么不以字节为单位获取size of the file,然后将其除以每行的字符数(如果每行具有相同数量的字符)或除以已处理的字符数以获得百分比?

ups:Jorge Nunez 已经说过了……

【讨论】:

  • 如果没有其他关于如何完成此操作的建议,我将不得不这样做。
  • 我不知道有什么方法可以在不读取整个文件的情况下从文件中获取指定字符的实际数量。 (可能通过一些硬件解决方案,但是......)即使是 linux 上的 'wc' 实际上也会读取整个文件。
【解决方案2】:

我不认为 C 有办法在不将文件加载到内存的情况下获取行数,因为这似乎是一个操作系统级别的函数,至少对我来说......

如果您在 UNIX 机器上,您可以使用“wc”命令来获取任何文件的行数。您应该能够通过“system”命令使用 C 运行它并将输出重定向到一个临时文件,然后您可以非常快速地访问该文件并从那里解析行数。

如果您使用的是 Windows,您可以使用 findstr 命令 'findstr /R /N "^" file.txt" 来获取行数。注意,这会将行打印一个冒号,然后所有文件中的行。我相信你可以把这个输出减少一点,但我不知道该怎么做。

【讨论】:

  • 不幸的是,我需要在 iOS 上进行。
  • 啊,我明白了。我没有查看 CHCSVParser 是什么,我认为它只是其他一些第三方工具。是的,那么使用操作系统级别的方法可能是不可能的。
猜你喜欢
  • 2019-03-25
  • 2020-01-20
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多