2015-10-07 2 views
1

У меня есть verly большой текстовый файл с несколькими миллионами строк, содержащих данные переписи, как этотRead очень большой текстовый файл в R эффективно

83400081732734890 
2873846391010001944545 
1829304000292399445 
934745875985958344552 
40599505500505055 
3457584947597594933332 
3938493840333398333 
444234432346777927272 
... 

каждая строка содержит набор переменных, которые разделены на основе заданной ширины. В моем примере выше четыре строки вместе создали один полный опросник из опроса. Поэтому на этом примере показаны два полных вопросника/два посещенных домохозяйства.

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

Допустим, что меня интересуют только переменные, которые содержатся в строках 1 и 3 каждого блока из 4 строк, как я могу заставить R читать только строку 1,3,5,7?

И: Помимо чтения только соответствующих строк, можно ли дополнительно ограничить чтение конкретным куском каждой строки, содержащей соответствующую информацию? Скажем, например, Я хотел бы прочитать только первые три цифры из первой строки (834 и 405) и последние пять цифр из третьей строки (99445 и 98333)?

Редактировать

Так как я хочу, чтобы читать выборочно решения, предлагаемые here не решить мою проблему. Кроме того, я не могу настроить базу данных SQL, так как я работаю на рабочей станции Windows 7 без административных прав. Я могу использовать инструменты командной строки из Powershell или аналогичные.

+0

@EricJ. - Не уверен, что это дубликат этого. Это добавляет требование выбора определенных кусков/строк. Может быть, обработка файла за пределами R с помощью инструментов командной строки (awk, sed и т. Д.) Может быть полезной? – thelatemail

ответ

2

Функция scan может обрабатывать многострочный ввод, если файл origianl достаточно регулярный. Тем не менее, это не так хорошо с переменной длиной записей.

res <- scan(text="83400081732734890 
2873846391010001944545 
1829304000292399445 
934745875985958344552 
40599505500505055 
3457584947597594933332 
3938493840333398333 
444234432346777927272 
", what=list(one="", two="", three="", four="")) # one list element per , line; 
                # use "" for text 

Read 2 records 
> first <- lapply(res[1], substr, 1, 3) 
> first 
$one 
[1] "834" "405" 


> third <- lapply(res[3], function(x) substr(x , nchar(x)-4, nchar(x))) 
> third 
$three 
[1] "99445" "98333" 

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

+0

работает немного лучше. Спасибо!! – user2383726

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