如何读取包含R中逗号的值的csv?

时间:2018-03-22 20:46:59

标签: r csv read.csv

我有一个工具(exe提供给我),输出格式不佳的csv。它们很糟糕,因为最后一个值可以有逗号,没有引号,例如:

184500,OBJECT_CALENDAR,,,UNITS_NO_UNITS,NULL,,,,Sched N&S B1,1st,3rd,4S,5th&6th

最后一个字符串实际上是从'Sched'开始的,所以我希望看到这样的东西:

184500,OBJECT_CALENDAR,,,UNITS_NO_UNITS,NULL,,,,"Sched N&S B1,1st,3rd,4S,5th&6th"

这搞砸了我想做的一切,我很好奇如何解决它。有没有办法在read.csv中定义列数?

我试图逐行阅读,但它很慢,而且不够优雅:

processFile = function(filepath) {
  i = 1
  vector = character(0)
  theFile = file(filepath, "r")
  while ( TRUE ) {
    line = readLines(theFile, n = 1)
    if ( length(line) == 0 ) {
      break
    } else {
      vector[i] <- line
      i = i+1
    }
  }
  close(theFile)
  formatted <- lapply(strsplit(vector[-1],','), function(x) {c(x[1:9], paste(x[10:length(x)], collapse = ','))})
  finalFrame <- as.data.frame(matrix(unlist(formatted),ncol = 10, byrow = TRUE))
  return(finalFrame)
}

有更好的方法吗?任何可以执行此操作的基本函数,如果没有,可以执行任何库吗?

2 个答案:

答案 0 :(得分:2)

这并不理想,因为您仍然需要逐行读取文件,但是 stringr::str_split有一个参数n,用于指定最大拆分数。如果您设置pattern = ","n=10,那么它会将您的字符串拆分为10个,将最后一个字符串保留为单个字符串。

答案 1 :(得分:2)

为每个列指定类似乎适用于我的情况。因此,如果您有4列,而第4列可能有不同数量的逗号,请尝试以下操作:

theData <- read.table(filepath, colClasses=rep("character" ,4))

当然根据您的情况调整列数及其类别。以下是我对玩具csv文件的了解:

> read.table("tmp.csv", colClasses=rep("character" ,4), header=FALSE)
  V1 V2 V3    V4
1 A, B, C,   1&2
2 A, C, C, 1,2,3
3 A, V, X,    12
4 A, V, D,   1,0

另一种选择是将read.csvfill=TRUE参数

一起使用
theData <- read.csv(filepath, fill=TRUE)

这将产生data.frame,其列数等于具有最大逗号数的行。然后,您必须手动将这些拆分逗号合并为一个。

注意:这只适用于只有最后一列可能有逗号的情况。