[英]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
另一個選擇是使用帶有fill=TRUE
參數的read.csv
theData <- read.csv(filepath, fill=TRUE)
這將生成一個data.frame
,其列數等於具有最大逗號數的行。 然后,您必須手動將這些拆分逗號合並為一個。
注意:這將適用於只有最后一列可以有逗號的松散的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.