Groovy: редактирование файла

#&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. …теперь у вас две проблемы … 🙂