2015-09-10 3 views
2

У меня есть текстовый файл с несколькими миллионами строк. Каждая строка должна иметь 10 переменных. Он разделяется запятой, но каждый раз в промежутке есть запятая (пример: строка 3, «BLDG # 5, # 104» должна быть одной переменной, но когда я импортирую ее с помощью read.csv(), она сбивает все с ног). Вот пример:Импорт адресного текстового файла

1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025 
2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025 
3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5,#104,SPRINGFIELD,IL,01010,02141650025 
4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025 

Любые рекомендации по наилучшему импорту этих данных?

+0

Если это текстовый файл, почему вы используете 'read.csv()', если вы хотите быстро читать большие файлы, попробуйте использовать 'fread (FILE, sep =", ")' из 'library (data.table) '... если это файл .csv, тогда попробуйте использовать' read.csv2() '@afleishman – Rime

+2

. Отметить, что вы нажимаете на свой вход, это« # ». По умолчанию это «comment.char». Если посторонние запятые всегда окружены октоторпами, может быть решение. Я знаю, как идентифицировать строки с избыточным количеством запятых. Почему бы вам не заняться еще более детективной работой и более подробно описать проблему? –

+2

У меня нет голоса, чтобы закрыть, в частности, почему. Может быть, кто-то случайно ударил по голосу, чтобы закрыть? –

ответ

1

Почему бы не просто использовать: read.csv Что вы больше всего цените в своих друзьях?

dat <- read.csv(text="1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025 
2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025 
3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5,#104,SPRINGFIELD,IL,01010,02141650025 
4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025", 
      header=FALSE, stringsAsFactors=FALSE, comment.char="", fill=TRUE) 

for (i in 1:nrow(dat)) { 
    if (is.na(dat[i, "V11"])) { 
    dat[i, 8:11] <- dat[i, 7:10] 
    dat[i, "V7"] <- NA 
    } 
} 

dat 

## V1   V2 V3 V4     V5  V6 V7   V8 V9  V10  V11 
## 1 1 09/29/1951 F N 22 MAIN STREET AVE APT 3 <NA>  SEATTLE WA 98102-3053 920670025 
## 2 2 09/28/1950 F N  13354 A STREET APT 2 <NA> BURLINGTON VT  10101 2510070025 
## 3 3 10/18/1949 M N 600 CENTRE STREET BLDG #5 #104 SPRINGFIELD IL  1010 2141650025 
## 4 4 10/18/1955 M N  5 KELLY AVENUE   <NA>  CITY XI  10101 2141650025 

Если вы хотите совместить V6 + V7 то это полностью выполнимо.

Делать это с data.table чутья будет гораздо более эффективным (например, если кто-то разместил в fread + чистое data.table решения, SHLD получить «ответ» клещ.

1

Это определяет линию с дополнительными полями с помощью countfields, и затем использует sub для удаления запятых между двумя октоторпами («#»). Учитывая размер набора данных, я предполагаю, что будет больше проблем, и вы должны найти, что count.fields будет очень полезен (см. ниже):

> Lines 
[1] "1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025\n2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025\n3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5,#104,SPRINGFIELD,IL,01010,02141650025\n4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025" 
> myLines <- readLines(textConnection(Lines)) 
> myLines 
[1] "1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025"  
[2] "2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025"   
[3] "3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5,#104,SPRINGFIELD,IL,01010,02141650025" 
[4] "4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025"      
> myLines[ count.fields(textConnection(myLines),sep=",", comment.char="") >10] <- sub("(#\\d+)(\\,)#", "\\1 &", myLines[ count.fields(textConnection(myLines),sep=",", comment.char="") >10]) 
> myLines 
[1] "1,09/29/1951,F,N,22 MAIN STREET AVE,APT 3,SEATTLE,WA,98102-3053,00920670025"  
[2] "2,09/28/1950,F,N,13354 A STREET,APT 2,BURLINGTON,VT,10101,02510070025"   
[3] "3,10/18/1949,M,N,600 CENTRE STREET,BLDG #5 &104,SPRINGFIELD,IL,01010,02141650025" 
[4] "4,10/18/1955,M,N,5 KELLY AVENUE,,CITY,XI,10101,02141650025"      
> read.csv(text=myLines, comment.char="",header=FALSE) 
    V1   V2 V3 V4     V5   V6   V7 V8   V9  V10 
1 1 09/29/1951 F N 22 MAIN STREET AVE  APT 3  SEATTLE WA 98102-3053 920670025 
2 2 09/28/1950 F N  13354 A STREET  APT 2 BURLINGTON VT  10101 2510070025 
3 3 10/18/1949 M N 600 CENTRE STREET BLDG #5 &104 SPRINGFIELD IL  01010 2141650025 
4 4 10/18/1955 M N  5 KELLY AVENUE      CITY XI  10101 2141650025 

Я предлагаю использовать table(count.fields(filename, sep=",", comment.char=""))), чтобы лучше оценить масштаб проблемы. Я подозреваю, что вы только что нашли первого из многих.

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