如何读取 R 中包含逗号的值的 csv?
How to read csv with values containing commas in R?
我有一个工具(提供给我的 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)
}
有什么更好的方法吗?任何可以执行此操作的基本函数,如果没有,是否有任何库?
这并不理想,因为您仍然需要逐行读取文件,但是
stringr::str_split
有一个参数 n
指定最大拆分数。如果您设置 pattern = ","
和 n=10
,那么它会将您的字符串拆分为 10 个部分,将最后一个块保留为单个字符串。
为每一列指定 类 似乎对我的情况有效。所以如果你有 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.csv
与 fill=TRUE
参数一起使用
theData <- read.csv(filepath, fill=TRUE)
这将生成一个 data.frame
,其列数等于逗号数最多的行。然后你将不得不手动将这些拆分的逗号组合成一个。
注意:这适用于只有最后一列可以有松散逗号的情况。
我有一个工具(提供给我的 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)
}
有什么更好的方法吗?任何可以执行此操作的基本函数,如果没有,是否有任何库?
这并不理想,因为您仍然需要逐行读取文件,但是
stringr::str_split
有一个参数 n
指定最大拆分数。如果您设置 pattern = ","
和 n=10
,那么它会将您的字符串拆分为 10 个部分,将最后一个块保留为单个字符串。
为每一列指定 类 似乎对我的情况有效。所以如果你有 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.csv
与 fill=TRUE
参数一起使用
theData <- read.csv(filepath, fill=TRUE)
这将生成一个 data.frame
,其列数等于逗号数最多的行。然后你将不得不手动将这些拆分的逗号组合成一个。
注意:这适用于只有最后一列可以有松散逗号的情况。