2016-01-17 6 views
1

Есть ли какая-либо функция в любом пакете, который может читать текстовый файл с регулярным выражением и возвращать номера строк найденных совпадений. Как gsubfn read.pattern может найти и извлечь шаблон, но не может вернуть номер строки, и grep не может читать файлы напрямую. Пример:R: альтернатива grep для файла без использования readLines?

файл:

.122448110000D+06 .400000000000D+01          
3 15 3 23 10 0 0.0 .267305411398D-03 .161435309564D-10 .000000000000D+01 
    .510000000000D+02 .625000000000D-01 .440982654411D-08 .306376855997D+00 
5 15 3 23 11 59 44.0 -.263226218521D-03 .488853402202D-11 .000000000000D+01 

картина: reg="^ *\\d+ +(?:[0-9]+ +){5}[.0-9]+.*$" для 2-й и 4-й матч линии. Так что я вообще хочу:

>file.grep(file,reg) 
[1] 2 4 

Есть ли что-нибудь в этом роде? Я получаю общую философию, когда занимаюсь такими вещами: readLines, а затем создаю творческий подход с grep, который хорош, если файлы не такие большие. Но я читал здесь, что у многих людей проблемы с большими, а не табличными структурами данных, вещи, которые могут быть решены с помощью такого инструмента (или с readLines, поддерживающим параметр regex skip), и мне интересно, сделал ли кто-нибудь подобное.

ответ

2

EDITED1

Я только что нашел другую должность, относящуюся к этому вопросу с альтернативным решением: grep while reading file

ОРИГИНАЛЬНЫЙ ПОСТ

это то, что вы ищете?

library(gsubfn) 

cat(" .122448110000D+06 .400000000000D+01 
3 15 3 23 10 0 0.0 .267305411398D-03 .161435309564D-10 .000000000000D+01 
.510000000000D+02 .625000000000D-01 .440982654411D-08 .306376855997D+00 
5 15 3 23 11 59 44.0 -.263226218521D-03 .488853402202D-11 .000000000000D+01", file = "test.txt") 
read.pattern(text = readLines("test.txt"), pattern = "^ *\\d+ +(?:[0-9]+ +){5}[.0-9]+.*$") 
+0

Очень аккуратный трюк, но, к сожалению, нет. Дело в том, что мне нужны строковые номера, чтобы извлекать вещи между ними не самими строками. Я хочу получить блок между двумя определенными линиями соответствия (например, ниже 2-го и до 4-го). Это будет работать, если read.pattern не читал строку за раз, тогда я мог бы походить с регулярным выражением и извлекать данные между совпадениями, но он делает это, и поэтому я не могу. – ephemeris

+0

Этот другой вопрос не будет работать: строки соответствия содержат дополнительные данные о блоках между ними, я не могу просто спеть все блоки вместе - у них может быть разное количество строк в них - указано в соответствующих строках. – ephemeris

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