【发布时间】:2010-11-30 05:26:27
【问题描述】:
免责声明:我不是程序员,从来没有,从来没有学过算法、CS 等。只需要使用它即可。
我的问题是:我需要根据第一个字段将一个巨大的(超过 4 GB)CSV 文件拆分为较小的文件(然后使用 require 'win32ole' 处理它)。在 awk 中这很容易:
awk -F ',' '{myfile=$1 ; print $0 >> (myfile".csv")}' KNAGYFILE.csv
但是ruby 我做到了:
open('hugefile').each { |hline|
accno = hline[0,12]
nline = hline[13,10000].gsub(/;/,",")
accfile = File.open("#{accno.to_s}.csv", "a")
accfile.puts nline
accfile.close
}
然后认识到它的资源效率低下(几个文件打开/关闭)。我确信有更好的方法可以做到这一点,你能解释一下吗?
更新: 只是忘了提及,文件在第一列排序。例如。如果这是大文件:
012345678901,1,1,1,1,1,1
012345678901,1,2,1,1,1,1
012345678901,1,1,A,1,1,1
012345678901,1,1,1,1,A,A
A12345678901,1,1,1,1,1,1
A12345678901,1,1,1,1,1,1
A12345678901,1,1,1,1,1,1
A12345678901,1,1,1,1,1,1
然后我需要两个新文件,分别命名为 012345678901.csv 和 A12345678901.csv。
【问题讨论】:
-
注意,你可能想要“hline[13..-1]”而不是“hline[13,10000]”,除非你特别想在 10013 个字符处截断你的行。
-
哇,你说你不是程序员而且有 16k 的代表!太棒了。
标签: ruby optimization csv io split