我有一個具有以下結構額外的逗號
123, NAME1, [email protected]
111, NAME2, [email protected]
一個非常大的CSV文件的問題是,一些名字有一個逗號,像
699, FIRST M. LAST, Jr., [email protected]
是否有解決這個問題的方法?原始的csv有aprox 80k條目,因此不可能手動完成。
謝謝!
我有一個具有以下結構額外的逗號
123, NAME1, [email protected]
111, NAME2, [email protected]
一個非常大的CSV文件的問題是,一些名字有一個逗號,像
699, FIRST M. LAST, Jr., [email protected]
是否有解決這個問題的方法?原始的csv有aprox 80k條目,因此不可能手動完成。
謝謝!
下面是使用正則表達式的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個步驟,比如,你可以這樣做:
## 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]
我用這個簡單的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中讀取它。
謝謝!
這是一個常見的問題,以及更好的答案之一是使用scan
或readLines
整個混亂載入R
,然後利用gsub
或其他正則表達式工具的線條分割成所需的元素。
編輯:看到這個方法
如何CSV文件?如果可能,您可以嘗試重新導出它們,指定應該引用字符串。 – A5C1D2H2I1M1N2O1R2T1
我試圖讓人們像這樣重新導出文件,但可能需要時間。我希望有一些R魔法來解決這個問題。 – Ignacio
如果沒有一些數據可以使用,我無法將其轉化爲答案,但我認爲可能是'library(「stringr」)',而str_split_fixed()'可能會導致結果。它總是一樣的字符串,還是有其他的罪魁禍首(「,Esq。」)或多於一個額外的逗號? – vaettchen