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