我试图read.csv数千个csv文件进入R,但是当我的文本中有逗号时,我陷入了很多麻烦。
我的csv文件有16列带有标题。第1栏中的一些案文有逗号。列2是字符串,第3列总是数字。
例如,第1栏中有一项是:“我不认识罗伯特、金或道格拉斯”--马库斯。A.十国集团主席
当我试图
df <- do.call("rbind", lapply(paste(CSVpath, fileNames, sep=""), read.csv, header=TRUE, stringsAsFactors=TRUE, row.names=NULL))
我得到一个有超过16列的df,上面的文本被分成4列:
V1 V2 V3 V4
"I do not know Robert Kim or Douglas" - Marcus. A. Ten Inc President
当我把它都写在一栏里的时候:
V1
"I do not know Robert, Kim, or Douglas"- Marcus. A. Ten, Inc President
发布于 2016-06-17 00:55:24
首先,如果您控制了数据输出格式,我强烈建议您要么(a)正确引用字段,要么(b)使用另一个字符作为分隔符(例如选项卡、管道“\”)。这是理想的解决方案,因为它肯定会加快未来的处理和“修复故障”,可以这么说。
缺少这一点,您可以尝试以编程方式修复所有行。假设只有第一列有问题(即所有其他列都是完全定义的),然后逐行将真分隔符更改为不同的分隔符(例如管道或制表符)。
在这个例子中,我有4个用逗号分隔的列,我将把合法的分隔符更改为管道。
"FALSE"
,而不是布尔数据类型。如果我们采用read.csv
和表兄妹所做的神奇类型检测,这是可以避免的,但为什么呢?nColumns-1
字段,将第一个字段与旧分隔符重新组合,生成一个单独的字段(用逗号);现在将其与剩余的nColumns-1
字段组合,并将它们与新分隔符组合。(顺便说一句:确保我们处理的是正确的双引号。)
txt2 <- splits(拆分,函数(Vec){n <- length(vec)如果(n < nColumns)返回(粘贴(vec,折叠= newsep)) vec1 <- vec1 (vec1:(n- nColumns + 1),折叠= oldsep) vec1 <- sprintf(‘’%s‘,gsub(’,‘’,vec1))粘贴(vec1,vec(n - nColumns + 2):n),( txt21 #1“\”我不认识罗伯特、金或道格拉斯\“\”-马库斯。A.十家公司总裁\“真”
(如果原始文件正确引用双引号,则可能不需要sprintf
行.但是,如果它有正确的引用,我们就不会有这个问题了。)con = "path/to/filename
:
writeLines(txt2) #“我不认识罗伯特、金或道格拉斯”--马库斯·A·滕公司总裁“\x{e76f}\\{e76f}\\{e76f}‘”’
(两个值得注意的变化:正确的逗号分隔符现在是管道,所有其他逗号仍然是逗号;双引号周围有正确的引号。是的,转义双引号就是两个双引号。如果字段中有引号,这就是R所期望的。)注:虽然这似乎适用于我的伪造数据(我希望它适用于你的数据),但你没有听说过有人在这种方式下吹嘘R的速度和效率。当然,也有更好的方法来实现这一点,比如使用python、awk或sed。在R中,可能有更快的方法可以做到这一点。
https://stackoverflow.com/questions/37869257
复制相似问题