首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文本有逗号时的readcsv

文本有逗号时的readcsv
EN

Stack Overflow用户
提问于 2016-06-16 21:00:27
回答 1查看 1.4K关注 0票数 0

我试图read.csv数千个csv文件进入R,但是当我的文本中有逗号时,我陷入了很多麻烦。

我的csv文件有16列带有标题。第1栏中的一些案文有逗号。列2是字符串,第3列总是数字。

例如,第1栏中有一项是:“我不认识罗伯特、金或道格拉斯”--马库斯。A.十国集团主席

当我试图

代码语言:javascript
运行
复制
df <- do.call("rbind", lapply(paste(CSVpath, fileNames, sep=""), read.csv, header=TRUE, stringsAsFactors=TRUE, row.names=NULL))

我得到一个有超过16列的df,上面的文本被分成4列:

代码语言:javascript
运行
复制
V1                        V2      V3                               V4
"I do not know Robert     Kim     or Douglas" - Marcus. A. Ten     Inc President

当我把它都写在一栏里的时候:

代码语言:javascript
运行
复制
V1
"I do not know Robert, Kim, or Douglas"- Marcus. A. Ten, Inc President
EN

回答 1

Stack Overflow用户

发布于 2016-06-17 00:55:24

首先,如果您控制了数据输出格式,我强烈建议您要么(a)正确引用字段,要么(b)使用另一个字符作为分隔符(例如选项卡、管道“\”)。这是理想的解决方案,因为它肯定会加快未来的处理和“修复故障”,可以这么说。

缺少这一点,您可以尝试以编程方式修复所有行。假设只有第一列有问题(即所有其他列都是完全定义的),然后逐行将真分隔符更改为不同的分隔符(例如管道或制表符)。

在这个例子中,我有4个用逗号分隔的列,我将把合法的分隔符更改为管道。

  1. 一些数据和神奇常数: “我不认识罗伯特、金或道格拉斯”-马库斯。答:10,公司总裁,真实,0,14“某事,其他",虚假,1,15”某事正确“,真实,2,22其他东西,假的,3,33‘nColumns <- 4#已知的先验<-”,“,”newsep <-“ 在您的例子中,您将阅读数据: txt <- readLines(“path/to/malformmed.csv”) nColumns <- 16
  2. 做一个手册(基于文本的,而不是数据类型的解析)分离: <- strsplit(readLines(textConnection(txt)),oldsep) 请注意,例如,它将假字段读取为逐字字符"FALSE",而不是布尔数据类型。如果我们采用read.csv和表兄妹所做的神奇类型检测,这是可以避免的,但为什么呢?
  3. 每行:首先忽略最后一个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行.但是,如果它有正确的引用,我们就不会有这个问题了。)
  4. 现在,要么将数据直接吸收到data.frame中: read.csv(textConnection(txt2),header = FALSE,sep = newsep) # V1 V2 V3 V4 #1“我不认识罗伯特、金或道格拉斯”-马库斯。答:十家公司总裁真0 14 #2“某事”,否则“假1 15 #3”某事正确2 22 #4其他虚假3 33 或者将这些内容写回一个文件(如果您想在其他地方处理这些文件很好),适当地添加con = "path/to/filename: writeLines(txt2) #“我不认识罗伯特、金或道格拉斯”--马库斯·A·滕公司总裁“\x{e76f}\\{e76f}\\{e76f}‘”’ (两个值得注意的变化:正确的逗号分隔符现在是管道,所有其他逗号仍然是逗号;双引号周围有正确的引号。是的,转义双引号就是两个双引号。如果字段中有引号,这就是R所期望的。)

注:虽然这似乎适用于我的伪造数据(我希望它适用于你的数据),但你没有听说过有人在这种方式下吹嘘R的速度和效率。当然,也有更好的方法来实现这一点,比如使用python、awk或sed。在R中,可能有更快的方法可以做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37869257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档