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

时间:2010-11-02 20:49:33

标签: r csv

我有一个相对较大的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(),是我唯一的选择吗? (我有点害怕破坏我的数据)谢谢!

4 个答案:

答案 0 :(得分:12)

这有点难看,但是你可以逐行读取文件并将其放在另一个文件中,逐行显示。这样你就永远不会把整个东西都读进记忆中。这与约书亚的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)

答案 1 :(得分:7)

如果您已经可以将数据导入R,那么使用scan将无济于事。

确保data仅包含您需要合并的列,并在尝试gc()命令之前运行paste(如果您靠近gc gawk你的记忆限制。)

如果失败,请查看this thread中的一些解决方案。


更新:
如果您碰巧使用* nix的风格,或者如果您在Windows上安装了Rtools,则可以使用foo.csv执行此操作。如果您的数据位于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 ,并在第二列附加“C1”。

{{1}}

这可能比R快,并且会消耗可忽略不计的内存量。

答案 2 :(得分:2)

只读一列,我假设可能是以后合并操作到内存的主要唯一标识符:

twocol <- read.table(file="what.csv", colClasses=("numeric", "character", rep("NULL", <number-of-remaining-columns>) , sep="," )
twocol$V2 <- paste(twocol$V2, "1C", sep="")
merge(twocol, otherdf, by.x="V1" , ....)

答案 3 :(得分:0)

将1C附加到第二列:

perl -F, -lane '$F[1] .= "1C"; print join ",", @F' file.csv

使用以下命令行选项:

  • -n循环输入文件的每一行
  • -l在处理之前删除换行符,然后将其添加回来
  • -a autosplit模式 - 将输入行拆分为@F数组。默认为在空格上拆分。
  • -e执行perl代码
  • -F autosplit修饰符,在这种情况下会在,
  • 上拆分

@F是每行中的单词数组,从$F[0]开始编制索引 .=是&#34;附加到&#34;运营商