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

R 读取逗号分隔的文件,该文件在列中也有逗号,r,csv,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

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

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
目标是接收完整的数据,而不考虑列中是否存在逗号,并且不应像分隔符一样工作

提前感谢

1)读取。模式
读取。模式
将根据提供的正则表达式读取字段。为了再现性,我们在下面的注释中使用了行,但如果数据在文件中,则将
text=Lines
替换为类似
“myfile.csv”

给予:

   Id                Notes Other_ID
1 100 This text looks good     1000
2 101 This text,have,comma     2000
   Id                Notes Other_ID
1 100 This text looks good     1000
2 101 This text,have,comma     2000
2)Base R将数据读入字符向量,并将每行的第一个和最后一个逗号替换为其他情况下不会出现的字符,如分号。然后读一下

L.raw <- readLines(textConnection(Lines))
L.semi <- sub(",(.*),", ";\\1;", L.raw)
read.table(text = L.semi, header = TRUE, sep = ";", as.is = TRUE)
3)gawk如果您有一个非常大的输入文件,那么在R之外尽可能多地执行操作可能会更快。使用
gawk
我们有以下内容。(在Windows上,如果您还没有
gawk
,请安装,并确保它位于您的路径上,或者使用整个路径名引用它。)在
BEGIN
块中,
first
是字段前面用逗号替换的逗号数,
last
是字段后面用逗号替换的逗号数。在这种情况下,带逗号的字段是3个字段中的第二个,因此first=last=1

# 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 = "")

棒极了,工作起来很有魅力,快速提问:我们必须定义(.*)吗数据集中出现的列数的倍?
read.pattern
中的模式必须与数据对应,因此如果数据具有不同的列数或列的顺序不同,则必须适当修改模式。我还有一个查询,该文本列中的逗号(,)数不是固定的,有些行有2个,有些行有7个。我们如何确定逗号的最大数量并防止它们将文本分割成几个部分。逗号的数量应该无关紧要。
^(.*),
捕获第一个逗号之前的所有内容,第一个
(.*),
捕获第一个逗号之后的所有内容,直到最后一个逗号为止,无论该字段包含多少个逗号,最后的
(.*)$
捕获最后一个字段。那么我必须输入(.*)吗是数据库中文本列数的两倍?还是定义一次(.*)就可以完成此任务?因为我有8列,开头有3个数字列,第4列为带逗号的文本,第5列为空白,第6列为数字,第7列为文本,第8列为文本。第5列为文本中唯一有逗号的一列,我为其编写了代码:^(.?),(.?),(.),(.,(.*),(.?),(.,(.),(.*)。如果我错了,请纠正我。
   Id                Notes Other_ID
1 100 This text looks good     1000
2 101 This text,have,comma     2000
# 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 = "")
Lines <- "Id,Notes,Other_ID
100,This text looks good, 1000
101,This text,have,comma,2000"