Как прочитать фрагмент из файла с помощью groovy?

Я читаю файл в groovy, используя этот простой пример кода

file.eachLine {line->
 // do something with line
}

Например, в моем файле есть такие данные

blah blah blah 
This is some more lines
more lines
Insert into something
(x1,x2,x3)
(Select * from
some table
where 
something = something)
on rowid = something;

Итак, я хочу прочитать отрывок. Если я вижу строку с rowid, в конце которой также есть точка с запятой. затем я хочу прочитать до '(выберите'

Итак, после прочтения этого файла я хочу иметь строку, содержащую:

(Select * from
    some table
    where 
    something = something)
    on rowid = something;

Это возможно? и как?


person josh    schedule 29.09.2009    source источник


Ответы (2)


Если содержимое вашего файла невелико, достаточно легко прочитать файл целиком, а затем использовать немного регулярного выражения, чтобы получить нужные вам части:

def file = new File('/home/bart/Temp/test.txt')
def contents = file.getText()
def matcher = contents =~ /\(Select[^)]++\)\s++.*?rowid\s=\s.*;/
matcher.each { println it }

Производит:

(Select * from
some table
where 
something = something)
on rowid = something;
person Bart Kiers    schedule 29.09.2009
comment
Благодарность! это регулярное выражение кажется интересным, но у меня оно не работает. в вашем файле test.txt у вас есть данные в отдельных строках или все в одной строке? - person Drake; 29.09.2009
comment
@Drake: все они в разных строках. Когда ввод представляет собой строку без разрывов строк, она все еще работает (вывод: '(Выбрать * из какой-то таблицы, где что-то = что-то) на rowid = что-то;'). Для записей: я использую Groovy 1.6. - person Bart Kiers; 30.09.2009
comment
... но если во входном файле нет разрывов строк, я бы немного изменил свое регулярное выражение: в этом случае никаких жадных DOT-STARS! - person Bart Kiers; 30.09.2009

Соберите строки в список, и когда вы заметите «;», остановите неявный цикл, выдав исключение.

Результат, который вы ищете, — это подсписок от list.lastIndexOf('(select') до конца списка.

person Aaron Digulla    schedule 29.09.2009
comment
в списке нет метода lastIndexOf - person Drake; 29.09.2009
comment
groovy.codehaus.org/groovy-jdk/java/util/List. html я не смог найти его в API. у вас есть ссылка, где это показано в примере? - person Drake; 29.09.2009
comment
Странный. Это упоминается в документации (groovy.codehaus.org/JN1015-Collections) и исправлено в GROOVY-1007 (jira.codehaus.org/browse/GROOVY-1007) - person Aaron Digulla; 29.09.2009