2013-09-16 110 views
1

我有一個具有以下結構額外的逗號

123, NAME1, [email protected] 
111, NAME2, [email protected] 

一個非常大的CSV文件的問題是,一些名字有一個逗號,像

699, FIRST M. LAST, Jr., [email protected] 

是否有解決這個問題的方法?原始的csv有aprox 80k條目,因此不可能手動完成。

謝謝!

+1

如何CSV文件?如果可能,您可以嘗試重新導出它們,指定應該引用字符串。 – A5C1D2H2I1M1N2O1R2T1

+0

我試圖讓人們像這樣重新導出文件,但可能需要時間。我希望有一些R魔法來解決這個問題。 – Ignacio

+0

如果沒有一些數據可以使用,我無法將其轉化爲答案,但我認爲可能是'library(「stringr」)',而str_split_fixed()'可能會導致結果。它總是一樣的字符串,還是有其他的罪魁禍首(「,Esq。」)或多於一個額外的逗號? – vaettchen

回答

1

下面是使用正則表達式的R解決方案flodel對細節的答案:產生

file <- textConnection("123, NAME1, [email protected] 
111, NAME2, [email protected] 
699, FIRST M. LAST, Jr., [email protected]") 

lines <- readLines(file) 
pattern <- "^(\\d+), (.*), \\b(.*)$" 
matches <- regexec(pattern, lines) 

bad.rows <- which(sapply(matches, length) == 1L) 
if (length(bad.rows) > 0L) stop(paste("bad row: ", lines[bad.rows])) 

data <- regmatches(lines, matches) 
as.data.frame(matrix(unlist(data), ncol = 4L, byrow = TRUE)[, -1L]) 

# V1     V2     V3 
# 1 123    NAME1 [email protected] 
# 2 111    NAME2 [email protected] 
# 3 699 FIRST M. LAST, Jr. [email protected] 
2

在2個步驟,比如,你可以這樣做:

## read using `fill=TRUE` 
dat <- read.table(text=' 
123, NAME1, [email protected] 
111, NAME2, [email protected] 
699, FIRST M. LAST, Jr., [email protected]',sep=',', 
        fill=TRUE, 
        header=FALSE,stringsAsFactors=FALSE) 
## concatenate names when they contain a comma 
dat$V3 <- ifelse(nchar(dat$V4)>0,paste(dat$V3,dat$V4,sep=','),dat$V3) 
dat[,-4] 
    V1    V2      V3 
1 123   NAME1  [email protected] 
2 111   NAME2   [email protected] 
3 699 FIRST M. LAST Jr., [email protected] 
+0

您的解決方案不適用於真實數據。當我讀表時,我只有4列。我認爲這是因爲第一個額外的逗號是像csv文件中的第74個。 :_( – Ignacio

+0

你是什麼意思是「在像csv文件74」? – agstudy

+0

我的意思是74行。 – Ignacio

0

我用這個簡單的Python腳本到我的數據轉換

import sys 

for line in open(sys.argv[1]): 
    x = line.split(',') 
    x = [token.strip() for token in x] 
    x = [x[0], '"%s"' % (",".join(x[1:-1])), x[-1]] 
    print ";".join(x) 

要運行它

python conv.py input.txt > output.txt 

後那我可以在沒有問題的情況下在R中讀取它。

謝謝!

0

這是一個常見的問題,以及更好的答案之一是使用scanreadLines整個混亂載入R,然後利用gsub或其他正則表達式工具的線條分割成所需的元素。

編輯:看到這個方法