2009-08-25 9 views
0

ich eine Beispieldatei wie die folgenden habe:Groovy: Bearbeiten eine Datei

CREATE GLOBAL TEMPORARY TABLE tt_temp_user_11 
(
asdfa 
) 
CREATE GLOBAL TEMPORARY TABLE tt_temp_user_11 
(
asdfas 
) 

some other text in file 

Ich mag diese Datei konvertieren in folgenden:

CREATE GLOBAL TEMPORARY TABLE 1 
(
asdfa 
) 
CREATE GLOBAL TEMPORARY TABLE 2 
(
asdfas 
) 

some other text in file 

Also im Grunde jedes zeitweiliges Auftreten TABLE haben wird Nummer angehängt zu ihm.

Bisher habe ich folgendes groovy Skript:

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" 
    } 

Wie kann ich den Text in der Datei ändern? sollte ich in eine andere Datei schreiben?

BTW, ich habe Verzeichnis in meinem Skript, weil ich an vielen dieser Art von Dateien in einem Verzeichnis arbeiten werde.

Ich hätte Perl für diese Aufgabe gewählt, wollte aber einen groovigen Versuch geben.

Antwort

1

Ich denke, Sie sollten in andere Datei schreiben, es ist eine gute Praxis. Legen Sie etwas wie Linie unten in Ihrem wenn {} (anstelle von i ++)

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

und dann außerhalb Ihrer wenn Schreibleitung Variable in outfile

BTW ich bin denken Sie besser zu nutzen == ~ in Ihrem if anstelle von indexOf

+0

Nur neugierig - warum empfehlen Sie == ~ anstelle von indexOf? Ist es schneller? – aldrin

+0

Ich schlage vor, regexp verwenden, denn in diesem Fall können Sie richtige "TEMPORARY TABLE" genauer erkennen. Mit anderen Worten, um Wörter TEMPORARY TABLE in Daten (z. B. TEMPORARY TABLE. */(Oder so) –

+1

... Jetzt hast du zwei Probleme ... :) –

2

Ich schrieb eine kleine Funktion, die funktioniert wie File.eachLine {} funktioniert, aber ermöglicht die Bearbeitung.

Sie können es wie folgt verwenden:

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

Das ist ziemlich leicht zu Code - was auch immer von der Schließung zurückgegeben wird, in die neue Datei geschrieben. Wenn Sie eine andere Datei wünschen, geben Sie zwei Dateinamen an.

 
    /** 
    * 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()) 
    } 
}