我有一个文件,其中列之间的分隔符是逗号(,
)。但是,逗号也可能出现在 列之内,即“注释”列:
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
目标是接收与列完整无缺的数据,而不管列中是否存在逗号,并且不应像定界符那样工作。
预先感谢
答案 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=