修改csv以避免解析问题

时间:2017-10-04 15:40:10

标签: r regex

我有一个csv文件,其行如下所示:

2, 3, c(a, b, c), o, d

我想读取这个csv但是将矢量c(a,b,c)保存在一列(变量)中。我正在考虑阅读我的CSV文件并更改这些向量中的分隔符(逗号)。例如,我会将前一个向量更改为以下内容:

2, 3, c(a; b; c), o, d

当我读取csv文件(read.csv)时,它不会将向量解析为单独的变量。我试图弄清楚我应该使用的正则表达式。

text <- "2, 3, c(a, b, c), o, d"
gsub("(c\\([a-z]?)(,)", "\\1;", text) #Something similar to this but as you could see I am struggling

该解决方案适用于以下情况:

2, 3, c(a), o, d
2, 3, c(a, b), o, d
2, 3, c(a, b, c, d), o, d

我正在尝试在R中执行此操作,因此除了使用gsub之外的任何其他程序包都可以。

1 个答案:

答案 0 :(得分:0)

1)用&#34; c(...)&#34;替换每个c(...);正如@bezet在评论中所建议的那样,然后使用read.table阅读它。没有包使用。

Lines <- rep("2, 3, c(a, b, c), o, d", 3) # sample input

Lines2 <- gsub('(c\\(.*?\\))', '"\\1"', Lines)
read.table(text = Lines2, sep = ",")

代码给出了这个数据框:

  V1 V2          V3 V4 V5
1  2  3  c(a, b, c)  o  d
2  2  3  c(a, b, c)  o  d
3  2  3  c(a, b, c)  o  d

2)此解决方案与问题中建议的一致,我们用c(...)部分中的分号替换命令。匹配(...)的每个最短事件,并在每个调用指定的gusb内用逗号分隔逗号。然后用|替换剩余的逗号字符和分号回到逗号。最后,使用read.tablesep="|"一起阅读。

library(gsubfn)

Lines2 <- gsubfn("\\(.*?\\)", ~ gsub(",", ";", x), Lines, perl = TRUE)
Lines2 <- chartr(";,", ",|", Lines2)
read.table(text = Lines2, sep = "|")

3)或者如果您知道精确的表单与指定模式的每一行匹配,read.pattern给出与输出相同的数据框。

library(gsubfn)

read.pattern(text = Lines, pattern = "^(\\S+), (\\S+), (\\S.+\\)), (\\S+), (\\S+)$")