如何阅读csv但只分开前两个逗号分隔符?

时间:2014-02-17 05:42:19

标签: r csv

我有一个CSV文件。我想在R中读取文件,但只使用前2个逗号,即如果文件中有这样的行,

  

1,1000,我,完成了,和你在一起

在R中,我希望将其放在具有三列的数据帧的行中,如此

> df <- data.frame("Id"="1","Count" ="1000", "Comment" = "I, am done, with you")
> df
  Id Count              Comment
1  1  1000 I, am done, with you

1 个答案:

答案 0 :(得分:4)

正则表达式将起作用。

例如,假设str是您要识别的行。这里假设您的csv文件看起来像

1,1000,I, am done, with you
2,500, i don't know

如果您想从文件中读取,只需调用readLines()将该文件的所有行读作R中的字符向量,就像str一样。

技术非常简单。在这里,我使用{stringr}包来匹配文本并提取我需要的信息。

str <- c("1,1000,I, am done, with you", "2,500, i don't know")

library(stringr)

# match the strings by pattern integer,integer,anything
matches <- str_match(str,pattern="(\\d+),(\\d+),\\s*(.+)")

这里我简要解释一下模式(\\d+),(\\d+),\\s*(.+)\\d代表数字字符,\\s代表空格字符,.代表任何内容。 +表示一个或多个,*表示无或有。 ()对模式进行分组,以便函数知道我们认为是一组信息。

如果你看matches,它看起来像是

     [,1]                          [,2] [,3]   [,4]                  
[1,] "1,1000,I, am done, with you" "1"  "1000" "I, am done, with you"
[2,] "2,500, i don't know"         "2"  "500"  "i don't know"        

看,str_match函数通过模式成功地将文本拆分为矩阵。然后我们的工作只是将矩阵转换为具有正确数据类型的数据框。

df <- data.frame(matches[,-1],stringsAsFactors=F)
colnames(df) <- c("Id","Count","Comment")
df <- transform(df,Id=as.integer(Id),Count=as.integer(Count))

df是我们的目标:

  Id Count              Comment
1  1  1000 I, am done, with you
2  2  1002         i don't know