#&roovy
#&roovy
Вопрос:
У меня есть пример файла, подобный следующему:
CREATE GLOBAL TEMPORARY TABLE tt_temp_user_11
(
asdfa
)
CREATE GLOBAL TEMPORARY TABLE tt_temp_user_11
(
asdfas
)
some other text in file
Я хочу преобразовать этот файл в следующее:
CREATE GLOBAL TEMPORARY TABLE 1
(
asdfa
)
CREATE GLOBAL TEMPORARY TABLE 2
(
asdfas
)
some other text in file
Таким образом, в основном к каждому вхождению ВРЕМЕННОЙ ТАБЛИЦЫ будет добавляться номер.
Пока у меня есть следующий &roovy-скрипт:
int i = 0
new File ("C:\Not_Modified").eachFile{file -&&t;
println "File name: ${file.name}"
new File ("C:\Not_Modified\" file.name).eachLine {line -&&t;
if (line.indexOf("TEMPORARY TABLE")&&t;0)
{
i
}
}
println "There are ${i} occurences of TEMPORARY TABLE"
}
Как я могу изменить текст в файле? должен ли я выполнять запись в другой файл?
кстати, в моем скрипте есть каталог, потому что я буду работать со многими файлами такого типа в каталоге.
Я должен был выбрать perl для этой задачи, но хотел попробовать &roovy.
Ответ №1:
Я написал небольшую функцию, которая работает примерно так же, как File.eachLine{} работает, но допускает редактирование.
Вы можете использовать это следующим образом:
def n=1 Модифицируйте файл("filename"){ if(it.StartsWith("СОЗДАТЬ ГЛОБАЛЬНУЮ ВРЕМЕННУЮ ТАБЛИЦУ")) верните "СОЗДАТЬ ГЛОБАЛЬНУЮ ВРЕМЕННУЮ ТАБЛИЦУ" n верните его // Повторно вставляет неизмененную строку " }
Это довольно легко закодировать — все, что возвращается после закрытия, записывается в новый файл. Если вам нужен другой файл, укажите два имени файла.
/** * Это приведет к полной перезаписи файла, будьте осторожны. * * Простое использование: * * Модифицируйте файл("C:whateverwhatever.txt ") { * если(это.содержит("soil")) * вернуть значение null // удалить грязное слово * еще * верните его * } * * Закрытие должно возвращать переданную строку, чтобы сохранить ее в файле или изменить ее, любое изменение * будет записан на его месте. * * Чтобы удалить целую строку вместо ее изменения, верните null * Чтобы добавить больше строк после возврата заданной строки: it " n" дополнительные строки * * Обратите внимание, что вы добавляете "n" перед дополнительными строками, а не после последней * один, потому что этот метод обычно добавляет один для вас. */ модифицируемый файл def(srcFile, закрытие c) { Модифицируйте файл (srcFile, srcFile, c) } def модифицирует файл(srcFile, destFile, Closure c={распечатайте его; верните}) { Strin&Buffer ret=новый Strin&Buffer(); File src=новый файл (srcFile) Удаление файла =новый файл (destFile) src.withReader{читатель-&&t; reader.eachLine{ строка определения=c(it) если(строка != null) { повторное добавление (строка) повторное добавление("n") } } } dest.delete() dest.write(ret.toStrin&()) } }
Ответ №2:
Я думаю, вам следует записать в другой файл, это хорошая практика. Поместите что-то вроде строки ниже внутри вашего if {} (вместо i )
строка = line.replaceFirst(/^(создать временную таблицу) (.*)/, "$1 таблица ${ i}")
и затем, за пределами вашей переменной if, запишите строку в outfile
Кстати, я думаю, вам лучше использовать ==~ в вашем if вместо indexOf
Комментарии:
1. Просто любопытно — почему вы предлагаете ==~ вместо indexOf ? Это быстрее?
2. Я предлагаю использовать re&exp, потому что в этом случае вы сможете более точно определить правильную «ВРЕМЕННУЮ ТАБЛИЦУ». Другими словами, чтобы избежать обнаружения слов ВРЕМЕННАЯ ТАБЛИЦА в данных (например / TEMPORARY TABLE .* / (/ или около того)
3. …теперь у вас две проблемы … 🙂