2017-10-04 80 views
0

我有行的CSV文件看起來像以下:修改CSV以避免解析問題

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

我想讀這個CSV但保留向量C(A,B,C)中的一列(變量)。我正在考慮閱讀我的CSV文件,並更改這些矢量中的分隔符(逗號)。當我讀到CSV文件(read.csv),它不會解析分離變量矢量

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

這樣:比如我前面的向量更改爲以下。我想弄清楚我應該使用的正則表達式。

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 

我試圖使用GSUB將努力做到這一點R中,所以任何其他包放在一邊。

+0

如果你真的堅持使用'''作爲矢量的分隔符,爲什麼不直接刪除空格,然後用','分割呢?對於您現有的設置,您可以使用這個'\ s *([^,] + \([^)] + \)| [^,] +)' – ctwheels

+2

如果您要創建此CSV,請考慮使用雙引號,是轉義CSV的「標準」方式。 – bezet

+1

你是怎麼得到一個看起來像這樣的CSV文件的?這可能是你應該解決的真正問題。 – MrFlick

回答

0

1)按照@bezet在註釋中所建議的將每個c(...)替換爲「c(...)」,然後使用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+)$")