读取以逗号分隔的文件,该文件在列中也有逗号

时间:2019-01-02 16:49:36

标签: r csv

我有一个文件,其中列之间的分隔符是逗号(,)。但是,逗号也可能出现在 列之内,即“注释”列:

Id,Notes,Other_ID
100,This text looks good,1000
101,This text,have,comma,2000

我试图阅读csv:

r <- read.csv("test.csv", sep = ",")

结果,我收到了:

Id.Notes.GUID
100,This text is good,1000
102,This text,have,comma,2000

这是不正确的,因为我希望将输出显示为

Id       Notes                  GUID
100      This text is good      1000
102      This text,have,comma  2000

目标是接收与列完整无缺的数据,而不管列中是否存在逗号,并且不应像定界符那样工作。

预先感谢

1 个答案:

答案 0 :(得分:3)

1)read.pattern read.pattern将根据提供的正则表达式读取字段。为了重现性,我们在下面的注释中使用了行,但是如果数据在文件中,请用text=Lines之类的内容替换"myfile.csv"

library(gsubfn)
read.pattern(text = Lines, pattern = "^(.*?),(.*),(.*)$", header = TRUE, as.is = TRUE)

给予:

   Id                Notes Other_ID
1 100 This text looks good     1000
2 101 This text,have,comma     2000

2)基数R 将数据读取到字符向量中,并将每行的第一个和最后一个逗号替换为其他情况下不会出现的字符,例如分号。然后阅读。

L.raw <- readLines(textConnection(Lines))
L.semi <- sub(",(.*),", ";\\1;", L.raw)
read.table(text = L.semi, header = TRUE, sep = ";", as.is = TRUE)

给予:

   Id                Notes Other_ID
1 100 This text looks good     1000
2 101 This text,have,comma     2000

3)gawk 如果输入文件很大,那么在R之外执行尽可能多的操作可能会更快。使用gawk,我们可以做到以下几点。 (在Windows上,请安装Rtools,如果您还没有gawk,并确保它在您的路径上,或者使用整个路径名对其进行引用。)在BEGIN块中,{ {1}}是在该字段前用逗号替换的逗号数,first是在该字段后用逗号替换的逗号数。在这种情况下,带逗号的字段是3个字段中的第二个,因此first = last = 1。

last

您还可以设置# generate test input Lines <- "Id,Notes,Other_ID 100,This text looks good, 1000 101,This text,have,comma,2000" cat(Lines, file = "ambuj.dat") # gawk program to replace commas ambuj.awk <- ' BEGIN { first = 1; last = 1 } { nc = gsub(/,/, ",") # number of commas for(i = nc; i > nc-last; i--) $0 = gensub(/,/, ";", i) # replace last last commas for(i = 0; i < first; i++) sub(/,/, ";") # replace first first commas print }' cat(ambuj.awk, file = "ambuj.awk") read.csv(pipe("gawk -f ambuj.awk ambuj.dat"), sep = ";", quote = "", comment.char = "") 来加快速度。

注意

colClasses=