我有一个相对较大的csv文件(1.2gb ...大到我的一台计算机上的2GB RAM).对于一列中的每个条目,我想附加"1C",以便我可以加入/合并另一个dataframe/db表.
如果文件不是那么大,那么很容易read.csv导入data然后再使用data$symbol <- paste(data$symbol, "1C", sep="").但现在我收到了can't allocate vector of size x警告.
手动解决方案scan(),我唯一的选择吗?(我有点害怕破坏我的数据)谢谢!
JD *_*ong 12
这有点难看,但是你可以逐行读取文件并将其放在另一个文件中,逐行显示.这样你就永远不会把整个东西都读进记忆中.这与Joshua的awk方法不同,但使用R(并且速度相当慢).以下示例是我拼凑在一起以从csv中删除美元符号和百分号的示例.您可以改变中间的逻辑来执行您想要的逻辑.
con <- file(inputFile, open = "r")
con2 <- file(temporaryFile, open = "w")
while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) {
oneLine <- gsub("%", "", oneLine) #strip out the percent signs
oneLine <- gsub("\\$", "", oneLine) #strip out the dollar signs
cat(oneLine, file = con2, sep = "\n") #spit the line back out
}
close(con)
close(con2)
Run Code Online (Sandbox Code Playgroud)
scan如果您已经可以将数据输入R,则使用无济于事.
确保data只有您需要合并的列,并gc()在尝试paste命令之前运行(gc如果您接近内存限制,则会有帮助).
如果失败,请查看此线程中的一些解决方案.
更新:
如果您碰巧使用*nix的味道,或者如果您在Windows上安装了Rtools,则可以使用gawk.如果您的数据在,foo.csv并且您想要将"C1"添加到第二列,这将创建一个新文件,bar.csv并在第二列附加"C1".
compy: /home/josh
> cat foo.csv
1,one,2,two
3,three,4,four
5,five,6,six
compy: /home/josh
> gawk -F "," '{OFS=","; $2=($2 "1C"); print}' < foo.csv > bar.csv
compy: /home/josh
> cat bar.csv
1,one1C,2,two
3,three1C,4,four
5,five1C,6,six
Run Code Online (Sandbox Code Playgroud)
这可能比R更快,并且将消耗可忽略的内存量.