如何反向读取CSV文件

时间:2019-09-16 09:00:43

标签: go

我正尝试反向读取CSV文件。我可以通过在切片中加载CSV文件的行并将其反转来做到这一点,但这对大文件来说是错误的方法。 CSV阅读器返回的游标不会将整个文件加载到内存中。

但是我找不到任何实现诸如reverseCSVReader之类的东西。

如何读取CSV文件而不将整个文件反向加载到内存中?

2 个答案:

答案 0 :(得分:0)

  

如何读取CSV文件而不将整个文件反向加载到内存中?

基本上没有。 CSV不是具有固定记录大小的格式,因此您不能直接访问单独的行。您总是必须从头开始阅读。但是,当然没有必要将您已阅读和不感兴趣的内容保存在内存中:编码/ csv并没有您想要避免的事情。

答案 1 :(得分:-2)

一些一般性建议:道歉,我不太了解Go或它的CSV库,以至于无法在这里知道这些是否可行。

  1. 在不处理数据的情况下进行CSV文件的转发,从而保存文件偏移(每行或每100行(例如))。然后,您可以向后遍历文件偏移量数组,一次查找每一行以处理或读取100行块,然后在代码中反向遍历该块。

  2. 实现自己的向后文件阅读器:将文件的最后16K读入二进制缓冲区,然后向后进行遍历以找到换行符,以标识您已找到行。然后处理这条线并寻找下一条;如果数据用完了,请加载下一个16K缓冲区以查找该行的开头。

    希望您可以从Go运行时库中为此借用逻辑。但是,如果文件中带引号的块中有换行符,则换行会变得很复杂,即换行符可能不代表新的CSV行,但是希望您知道数据是否正确。

  3. 找到一些外部实用程序来为您反转文件,例如如果每一行都以时间戳或记录ID开头,那么您可能就可以使用操作系统的内置排序(给出或采用列标题行)。然后,您可以只处理应用程序中已经反转的文件。