将后缀附加到csv文件(或SQLite数据库)中的条目列

Ric*_*ron 2 csv r

我有一个相对较大的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)


Jos*_*ich 7

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更快,并且将消耗可忽略的内存量.

  • @richardh如果你把它带入SQLite中是否有令人信服的理由不在SQLite中进行追加操作? (2认同)