Groovy: редактирование файла - PullRequest
0 голосов
/ 26 августа 2009

У меня есть образец файла, подобный следующему:

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

Таким образом, к каждому вхождению TEMPORARY TABLE будет добавлен номер.

Пока у меня есть следующий скрипт:

int i = 0
new File ("C:\\Not_Modified").eachFile{file ->
        println "File name: ${file.name}"
        new File ("C:\\Not_Modified\\"+file.name).eachLine {line ->
                if (line.indexOf("TEMPORARY TABLE")>0)
                {
                    i++
                }
            }
        println "There are ${i} occurences of TEMPORARY TABLE"
    }

Как я могу изменить текст в файле? я должен писать в другой файл?

Кстати, у меня есть каталог в моем скрипте, потому что я буду работать с большим количеством файлов такого типа в каталоге.

Я должен был выбрать Perl для этой задачи, но хотел попробовать Groovy.

Ответы [ 2 ]

2 голосов
/ 26 января 2013

Я написал небольшую функцию, которая работает примерно так же, как File.eachLine {}, но позволяет редактировать.

Вы можете использовать это так:

def n=1
modifyFile("filename"){
    if(it.startsWith("CREATE GLOBAL TEMPORARY TABLE"))
        return "CREATE GLOBAL TEMPORARY TABLE " + n++
    return it // Re-inserts unmodified line"
}

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

    /**
     * This will completely re-write a file, be careful.
     * 
     * Simple Usage:
     *
     * modifyFile("C:\whatever\whatever.txt") {
     *   if(it.contains("soil"))
     *      return null  // remove dirty word
     *   else
     *      return it
     * }
     *
     * The closure must return the line passed in to keep it in the file or alter it, any alteration
     * will be written in it's place.
     *
     * To delete an entire line instead of changing it, return null
     * To add more lines after a given line return: it + "\n" + moreLines
     *
     * Notice that you add "\n" before your additional lines and not after the last
     * one because this method will normally add one for you.
     */
    def modifyFile(srcFile, Closure c) {
        modifyFile(srcFile, srcFile, c)
    }

    def modifyFile(srcFile, destFile, Closure c={println it;return it}) {
        StringBuffer ret=new StringBuffer();
        File src=new File(srcFile)
        File dest=new File(destFile)

        src.withReader{reader->
            reader.eachLine{
                def line=c(it)
                if(line != null) {
                    ret.append(line)
                    ret.append("\n")
                }
            }
        }
        dest.delete()
        dest.write(ret.toString())
    }
}   
1 голос
/ 27 августа 2009

Я думаю, вы должны написать в другой файл, это хорошая практика. Поместите что-то вроде строки ниже внутри вашего if {} (вместо i ++)

line = line.replaceFirst(/^(create temporary table) (.*)/, "\$1 table${++i}")

и затем, вне вашей, если записать переменную строки в выходной файл

Кстати, я думаю, вам лучше использовать == ~ в вашем if вместо indexOf

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