2013-09-16 3 views
1

У меня есть очень большие CSV файлов, имеет следующую структурулишних запятых в задачах Csv вызывая

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

Проблема в том, что некоторые имена имеют запятая, что-то вроде

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

Есть способ решить это? Оригинал csv имеет aprox 80k записей, поэтому делать это вручную невозможно.

Спасибо!

+1

Как были файлы CSV сгенерированного? Если возможно, вы можете попытаться переэкспонировать их, указав, что строки должны быть указаны. – A5C1D2H2I1M1N2O1R2T1

+0

Я пытаюсь заставить людей переэкспортировать файл таким образом, но это может занять некоторое время. Я надеялся, что некоторые магии R решить эту проблему. – Ignacio

+0

Без каких-либо данных для воспроизведения я не могу включить это в ответ, но я думаю, что, возможно, 'library (" stringr ")' и в этом 'str_split_fixed()' может привести к результату. Всегда ли это одна и та же строка, или есть другие преступники («, эсквайр») или более одной дополнительной запятой? – vaettchen

ответ

1

Вот R решение, используя регулярное выражение:

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 столбца. Я думаю, что это потому, что первая дополнительная запятая находится как 74 файла csv. : _ ( – Ignacio

+0

что вы подразумеваете под «находится в 74 файлах csv»? – agstudy

+0

я имел в виду строку 74. – Ignacio

0

Я использую этот простой питон скрипт для преобразования мои данные

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

Это часто задаваемый вопрос, и один из лучших ответов использовать scan или readLines, чтобы загрузить весь беспорядок в R, а затем использовать gsub или других регулярных выражений инструменты для разделения строк в нужные элементы.

EDIT: см ответ flodel для уточнения деталей этого подхода

Смежные вопросы