使用 r 中的 fread 读取逗号分隔的 csv 文件,其中包含包含逗号的字段
Read comma separated csv file with fields containing commas using fread in r
我有一个用逗号分隔的 csv 文件。但是,有些字段包含逗号,例如公司名称“Apple, Inc”,这些字段将分为两列,这会导致使用 fread 出现以下错误。
“在第 5 行提前停止。预计有 26 个字段,但找到了 27 个。”
关于如何正确加载此文件的任何建议?提前致谢!
添加:
示例行如下。似乎有些字段用逗号没有引号。但是他们在字段内的逗号后面有空格。
100,Microsoft,azure.com
300,IBM,ibm.com
500,Google,google.com
100,Amazon, Inc,amazon.com
400,"SAP, Inc",sap.com
对我来说很好用。你能提供一个可重现的例子吗?
library(data.table)
# Create example and write out
df_out <- data.frame("X" = c("A", "B", "C"),
"Y"= c("a,A", "b,B", "C"))
write.csv(df_out, file = "df.csv", row.names = F)
# Read in CSV with fread
df_in <- fread("./df.csv")
df_in
X Y
1: A a,A
2: B b,B
3: C C
1) 使用最后在注释中创建的测试文件并假设该文件没有分号(如果有则使用其他字符)读取行,用分号替换第一个和最后一个逗号,然后将其作为分号分隔文件读取。
L <- readLines("firms.csv")
read.table(text = sub(",(.*),", ";\1;", L), sep = ";")
## V1 V2 V3
## 1 100 Microsoft azure.com
## 2 300 IBM ibm.com
## 3 500 Google google.com
## 4 100 Amazon, Inc amazon.com
## 5 400 SAP, Inc sap.com
2) 另一种方法是使用 gsub 将每个逗号后跟 space 替换为分号后跟 space 然后使用 chartr 替换每个逗号加分号,每个分号加逗号,然后读入
作为分号分隔的文件。
L <- readLines("firms.csv")
read.table(text = chartr(",;", ";,", gsub(", ", "; ", L)), sep = ";")
## V1 V2 V3
## 1 100 Microsoft azure.com
## 2 300 IBM ibm.com
## 3 500 Google google.com
## 4 100 Amazon, Inc amazon.com
## 5 400 SAP, Inc sap.com
3) 如果没有太多这样的行,另一种可能性是找到它们,然后在文本编辑器中将有问题的字段用引号括起来。然后就可以正常读入了。
which(count.fields("firms.csv", sep = ",") != 3)
## [1] 4
备注
Lines <- '100,Microsoft,azure.com
300,IBM,ibm.com
500,Google,google.com
100,Amazon, Inc,amazon.com
400,"SAP, Inc",sap.com
'
cat(Lines, file = "firms.csv")
我有一个用逗号分隔的 csv 文件。但是,有些字段包含逗号,例如公司名称“Apple, Inc”,这些字段将分为两列,这会导致使用 fread 出现以下错误。
“在第 5 行提前停止。预计有 26 个字段,但找到了 27 个。”
关于如何正确加载此文件的任何建议?提前致谢!
添加:
示例行如下。似乎有些字段用逗号没有引号。但是他们在字段内的逗号后面有空格。
100,Microsoft,azure.com
300,IBM,ibm.com
500,Google,google.com
100,Amazon, Inc,amazon.com
400,"SAP, Inc",sap.com
对我来说很好用。你能提供一个可重现的例子吗?
library(data.table)
# Create example and write out
df_out <- data.frame("X" = c("A", "B", "C"),
"Y"= c("a,A", "b,B", "C"))
write.csv(df_out, file = "df.csv", row.names = F)
# Read in CSV with fread
df_in <- fread("./df.csv")
df_in
X Y
1: A a,A
2: B b,B
3: C C
1) 使用最后在注释中创建的测试文件并假设该文件没有分号(如果有则使用其他字符)读取行,用分号替换第一个和最后一个逗号,然后将其作为分号分隔文件读取。
L <- readLines("firms.csv")
read.table(text = sub(",(.*),", ";\1;", L), sep = ";")
## V1 V2 V3
## 1 100 Microsoft azure.com
## 2 300 IBM ibm.com
## 3 500 Google google.com
## 4 100 Amazon, Inc amazon.com
## 5 400 SAP, Inc sap.com
2) 另一种方法是使用 gsub 将每个逗号后跟 space 替换为分号后跟 space 然后使用 chartr 替换每个逗号加分号,每个分号加逗号,然后读入 作为分号分隔的文件。
L <- readLines("firms.csv")
read.table(text = chartr(",;", ";,", gsub(", ", "; ", L)), sep = ";")
## V1 V2 V3
## 1 100 Microsoft azure.com
## 2 300 IBM ibm.com
## 3 500 Google google.com
## 4 100 Amazon, Inc amazon.com
## 5 400 SAP, Inc sap.com
3) 如果没有太多这样的行,另一种可能性是找到它们,然后在文本编辑器中将有问题的字段用引号括起来。然后就可以正常读入了。
which(count.fields("firms.csv", sep = ",") != 3)
## [1] 4
备注
Lines <- '100,Microsoft,azure.com
300,IBM,ibm.com
500,Google,google.com
100,Amazon, Inc,amazon.com
400,"SAP, Inc",sap.com
'
cat(Lines, file = "firms.csv")