在CSV文件中替换不正确的逗号

时间:2015-06-23 09:37:08

标签: regex r csv

之前可能已经提出过这个问题,但我找不到。我有一个CSV文件列表(439左右),在一些文件中,有人也在编辑评论中使用了逗号。结果是我无法将文件放入数据框中,因为文件在拆分后现在没有相同数量的元素。无论如何,我面临的问题看起来像这样:

vec1 <- paste("484,1213,0,62.0006,1,go -- late F1 max, but glide?")
vec2 <- paste("467,1387,0,62.0026,1,goes2")

ls <- list(vec1, vec2)

我想要做的是拥有一个包含六列的数据框。如果vec1的编辑评论中没有逗号,我可以使用(并且一直在使用,直到我发现这个有问题的例子)以下内容:

df <- ldply(ls, function(x)unlist(strsplit(x[1], split = ",")))

但是,我收到明显的错误消息,结果的长度数量不同。有没有办法摆脱那个逗号,或者把它变成一个分号,或者确保如果一个向量中有7个元素,6和7组合在一起?

如果它有帮助,这就是我在读R中的文件的方式(我正在使用scan,因为我想要的文件中还有其他信息。这里还有一些奇怪的编码问题,但这似乎工作)。

data <- scan(file, fileEncoding="latin1", blank.lines.skip = FALSE, what = "list", sep = "\n", quiet = TRUE)   

1 个答案:

答案 0 :(得分:2)

如果您需要评论,仍然可以用分号替换第6个逗号并使用以前的解决方案:

gsub("((?:[^,]*,){5}[^,]*),", "\\1;", vec1, perl=TRUE)

正则表达式解释

  • ((?:[^,]*,){5}[^,]*) - 我们将在替换模式中以\\1作为第1组引用的捕获组,匹配
    • (?:[^,]*,){5} - 5个非逗号字符序列,后跟逗号
    • [^,]* - 0个或更多非逗号
  • , - 我们将在替换中变成;的逗号

或者(正如@CathG指出的那样,\\K运算符也可以与类似Perl的表达式一起使用)

sub("^([^,]+,){5}[^,]+\\K,", ";", vec1, perl=T)

来自PCRE documentation

  

转义序列\K导致任何先前匹配的字符不包含在最终匹配序列中。

但是,它不会“标准化”可能跟随的任何其他逗号。