【发布时间】:2012-12-28 09:19:56
【问题描述】:
我有两个大型 CSV 文件。一个文件只是一个记录列表。另一个文件是记录列表,但第一列是它在另一个文件中修改的记录的行号。它不会替换整行;它只是替换具有匹配标题的行中的值。
例如:
文件 1:
"First","Last","Lang"
"John","Doe","Ruby"
"Jane","Doe","Perl"
"Dane","Joe","Lisp"
文件 2:
"Seq","Lang"
2,"Ruby"
我们的目标是最终得到一个如下所示的文件:
"First","Last","Lang"
"John","Doe","Ruby"
"Jane","Doe","Ruby"
"Dane","Joe","Lisp"
然而,数据比这复杂得多,甚至可能在 CSV 中包含换行符。因此,我不能依赖行号,而必须依赖记录数。 (当然,除非我对这两个文件都进行了预处理以替换换行符和回车符......我认为这是可能的,但没那么有趣。)
我的问题是如何在不将整个文件中的任何一个加载到内存的情况下循环遍历这两个文件并进行正确的替换。我相信将 100mb+ 文件加载到内存中是个坏主意,对吧?
此外,完成后生成的文件中的记录应按
【问题讨论】:
-
猜猜这些手工编码的 CSV 文件?我假设是因为您将每个字符串包装在
"中,而对于您提供的值来说这完全没有必要。 -
文件 2 的“Seq”列是否按顺序排列?
-
我只是手动输入示例。在真实文件的情况下,除非必要,否则其中一个不使用引号,而另一个强制引用。 CSV 应该以任何一种方式解析它们,带或不带引号。
-
pguardiario:是的,它应该总是按顺序排列的。