我正尝试反向读取CSV文件。我可以通过在切片中加载CSV文件的行并将其反转来做到这一点,但这对大文件来说是错误的方法。 CSV阅读器返回的游标不会将整个文件加载到内存中。
但是我找不到任何实现诸如reverseCSVReader之类的东西。
如何读取CSV文件而不将整个文件反向加载到内存中?
答案 0 :(得分:0)
如何读取CSV文件而不将整个文件反向加载到内存中?
基本上没有。 CSV不是具有固定记录大小的格式,因此您不能直接访问单独的行。您总是必须从头开始阅读。但是,当然没有必要将您已阅读和不感兴趣的内容保存在内存中:编码/ csv并没有您想要避免的事情。
答案 1 :(得分:-2)
一些一般性建议:道歉,我不太了解Go或它的CSV库,以至于无法在这里知道这些是否可行。
在不处理数据的情况下进行CSV文件的转发,从而保存文件偏移(每行或每100行(例如))。然后,您可以向后遍历文件偏移量数组,一次查找每一行以处理或读取100行块,然后在代码中反向遍历该块。
实现自己的向后文件阅读器:将文件的最后16K读入二进制缓冲区,然后向后进行遍历以找到换行符,以标识您已找到行。然后处理这条线并寻找下一条;如果数据用完了,请加载下一个16K缓冲区以查找该行的开头。
希望您可以从Go运行时库中为此借用逻辑。但是,如果文件中带引号的块中有换行符,则换行会变得很复杂,即换行符可能不代表新的CSV行,但是希望您知道数据是否正确。
找到一些外部实用程序来为您反转文件,例如如果每一行都以时间戳或记录ID开头,那么您可能就可以使用操作系统的内置排序(给出或采用列标题行)。然后,您可以只处理应用程序中已经反转的文件。