2013-09-30 4 views
2

Я пытаюсь читать в огромном CSV-файле из R, но у меня возникают проблемы, поскольку элементы столбцов, которые предположительно находятся в строковом формате, не разделяются кавычками и создает новую строку каждый раз, когда появляется новая строка. Мои данные ограничены символом ~.строки read.csv без кавычек в R

Например, мои данные выглядит что-то похожее на это:

a ~ b ~ c ~ d ~ e 
1 ~ name1 ~ This is a paragraph. 

This is a second paragraph. 

~ num1 ~ num2 ~ 

2 ~ name2 ~ This is an new set of paragraph. 

~ num1 ~ num2 ~ 

Я надеюсь, чтобы получить что-то вроде этого:

 

a |  b  |   c          | d  | e | 
____________________________________________________________________________________ 
1 | name1 | This is a paragraph. This is a second paragraph. | num1 | num2 | 

2 | name2 | This is a new set of paragraph.     | num1 | num2 | 

Но я в конечном итоге с чем-то уродливым, как это:

 

a       | b |   c    | d  | e | 
__________________________________________________________________________________ 
1       | name1 | This is a paragraph. |  |  | 

This is a second paragraph |   |       |  |  | 
          | num1 |  num2 
2       | name2 | This is a new set of paragraph. | num1 | num2 | 

Я попытался установить allowEscapes = TRUE в read.csv, но это не помогло. Мой вход в настоящее время выглядит следующим образом:

read.csv(filename, header = T, sep = '~', stringAsFactors = F, fileEncoding = "latin1", quote = "", strip.white = TRUE) 

Моя следующая идея заключается в том, чтобы вставить цитату после каждого ~, но я надеюсь увидеть, если есть более эффективные методы.

Любая помощь будет оценена по достоинству.

+2

Добро пожаловать в SO. Пожалуйста, укажите образцы данных – Metrics

+0

Каждая строка заканчивается '' ', я прав? – zero323

+0

@Metrics: Я не могу предоставить данные примера, потому что 1) он большой и грязный, 2) я получаю его через базу моего наблюдателя и не могу копировать и вставлять данные. Но этот пример должен быть близок к данным – samuraiexe

ответ

3

Нечто подобное, например:

ll = readLines(textConnection('a ~ b ~ c ~ d ~ e 
1 ~ name1 ~ This is a paragraph. 
This is a second paragraph. 
~ num1 ~ num2 ~ 
2 ~ name2 ~ This is an new set of paragraph. 
~ num1 ~ num2 ~')) 
## each line begin with a numeric followed by a space 
## I use this pattern to sperate lines 
llines <- split(ll[-1],cumsum(grepl('^[0-9] ',ll[-1]))) 
## add the header to the splitted and concatenated lines 
read.table(text=unlist(c(ll[1],lapply(llines,paste,collapse=''))), 
      sep='~',header=TRUE) 


     a             b  c  d e 
1 name1 This is a paragraph. This is a second paragraph. num1 num2 NA 
2 name2     This is an new set of paragraph. num1 num2 NA 
+0

. Спасибо, я попробую этот метод завтра и расскажу вам, как это работает, как посмотреть, как мой супервайзер выключил свой компьютер на день, чтобы я мог Не обращайтесь к данным. – samuraiexe

+0

«Когда я выполняю часть документа, который я должен проанализировать», я получаю следующую ошибку: больше столбцов, чем имена столбцов – samuraiexe

0

Когда я увидел, что это проблема обработки текстов, я решил Python будет намного проще. Извинения, если вы не знакомы с ним или не имеют доступа к нему:

import csv 

all_rows = [] 
with open('tilded_csv.txt') as in_file: 
    header_line = next(in_file) 
    header = header_line.strip().split('~') 
    current_record = [] 
    for line in in_file: 
     # Assume that a number at the start of a line 
     # signals a new record 
     if line[0].isdigit(): 
      new_record = line.strip() 
      if current_record: 
       all_rows.append(current_record.split('~')) 
      current_record = line.strip() 
     else: 
      current_record += line.strip() 
# Add the last record 
all_rows.append(current_record.split('~')) 

with open('standard_csv.csv', 'w') as out_file: 
    out_csv = csv.writer(out_file, dialect='excel') 
    out_csv.writerow(header) 
    for row in all_rows: 
     out_csv.writerow(row) 
+0

На самом деле, мой предпочтительный язык - это python, но я уже импортировал другие файлы, которые мне нужно экспортировать в базу данных (postgresql), используя R, поэтому я решил, что должен придерживаться стандартного языка для этой задачи. Худший сценарий - использовать python. Но спасибо за подсказку. – samuraiexe

2

Вот подход R, который зависит от (1) ~ быть истинным ограничителем, который не появится ни в одном из ваши абзацы и (2) ~, появляющиеся в конце каждой записи.

Но сначала некоторые образцы данных (так, чтобы другие могли также воспроизвести вашу проблему).

cat("a ~ b ~ c ~ d ~ e", 
    "1 ~ name1 ~ This is a paragraph.", 
    "", 
    "This is a second paragraph.", 
    "", 
    "~ num1 ~ num2 ~", 
    "", 
    "2 ~ name2 ~ This is an new set of paragraph.", 
    "", 
    "~ num1 ~ num2 ~", sep = "\n", file = "test.txt") 

Мы начнем с readLines, чтобы получить данные. Мы также добавим ~ в конце строки заголовка.

x <- readLines("test.txt") 
x[1] <- paste(x[1], "~") ## Add a ~ at the end of the first line 

Теперь мы будем paste все в хорошей длинной строки.

y <- paste(x, collapse = " ") 

Использование scan быстро «читать» данные еще раз, но вместо использования file аргумента, мы будем использовать text аргумент и ссылаться на «у» объекта, который мы только что создали. Поскольку последняя строка заканчивается ~, в конце будет добавлен дополнительный номер "", который мы удалим перед продолжением.

z <- scan(text = y, what = character(), sep = "~", strip.white = TRUE) 
# Read 16 items 
z <- z[-length(z)] 

Поскольку теперь мы имеем вектор символов, мы можем легко преобразовать это matrix, а затем к data.frame. Мы знаем, что colnames являются первыми пятью значениями, поэтому мы отбросим их при создании matrix и введем их в качестве имен data.frame.

df <- setNames(data.frame(
    matrix(z[6:length(z)], ncol = 5, byrow = TRUE)), z[1:5]) 
df 
# a  b             c d e 
# 1 1 name1 This is a paragraph. This is a second paragraph. num1 num2 
# 2 2 name2     This is an new set of paragraph. num1 num2 
+0

Ничего себе. +1. Это круто. : -0 –

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