2013-06-04 5 views
5

Ho un file che ho bisogno di modificare. La parte che devo modificare (non l'intero file), è simile alle proprietà mostrate sotto. Il problema è che ho solo bisogno di sostituire parte del "valore", "ConfigurablePart", se lo desideri. Ricevo questo file quindi non posso controllare il suo formato.Ho bisogno del metodo Groovy per eseguire sostituzioni di file parziali

alpha.beta.gamma.1 = constantPart1ConfigurablePart1 
alpha.beta.gamma.2 = constantPart2ConfigurablePart2 
alpha.beta.gamma.3 = constantPart3ConfigurablePart3 

Ho fatto questo lavoro in questo modo, anche se so che è molto brutto!

def updateFile(String pattern, String updatedValue) { 
    def myFile = new File(".", "inputs/fileInherited.txt") 
    StringBuffer updatedFileText = new StringBuffer() 
    def ls = System.getProperty('line.separator') 
    myFile.eachLine{ line -> 
     def regex = Pattern.compile(/$pattern/) 
     def m = (line =~ regex) 
     if (m.matches()) { 
      def buf = new StringBuffer(line) 
      buf.replace(m.start(1), m.end(1), updatedValue) 
      line = buf.toString() 
     } 
     println line 
     updatedFileText.append(line).append(ls) 
    } 
    myFile.write(updatedFileText.toString()) 
} 

Il modello passato è necessario per contenere un gruppo sostituito in StringBuffer. Qualcuno sa come dovrebbe essere fatto veramente in Groovy?

EDIT - per definire i risultati attesi

Il file che contiene le righe di esempio deve essere aggiornato in modo che il "ConfigurablePart" di ciascuna riga è sostituita con il testo aggiornato fornito. Per la mia brutta soluzione, dovrei chiamare il metodo 3 volte, una volta per sostituire ConfigurablePart1, una volta per ConfigurablePart2 e infine per ConfigurablePart3. Probabilmente c'è un approccio migliore anche a questo !!!

* AGGIORNAMENTO - risposta che ha fatto quello che ho davvero bisogno *

Nel caso in cui gli altri mai colpito un problema simile, i miglioramenti codice Groovy ho chiesto sono meglio riflette nella risposta accettata. Tuttavia, per il mio problema, questo non ha risolto completamente i miei problemi. Poiché dovevo sostituire solo una parte delle linee abbinate, avevo bisogno di usare riferimenti e gruppi. L'unico modo ho potuto fare questo lavoro è stato quello di definire un RegEx in tre parti come:

(.*)(matchThisPart)(.*) 

Una volta che è stato fatto, sono stato in grado di utilizzare:

it.replaceAdd(~/$pattern/, "\$1$replacement\$3") 

Grazie ad entrambe le risposte - ogni aiutato io fuori molto!

+0

uscita prevista per Favore ... – HamZa

risposta

6

Può essere reso più dettagliato con l'uso di chiusura come args. Ecco come questo può essere fatto:

//abc.txt 
abc.item.1 = someDummyItem1 
abc.item.2 = someDummyItem2 
abc.item.3 = someDummyItem3 
alpha.beta.gamma.1 = constantPart1ConfigurablePart1 
alpha.beta.gamma.2 = constantPart2ConfigurablePart2 
alpha.beta.gamma.3 = constantPart3ConfigurablePart3 
abc.item.4 = someDummyItem4 
abc.item.5 = someDummyItem5 
abc.item.6 = someDummyItem6 

codice Groovy: -

//Replace the pattern in file and write to file sequentially. 
def replacePatternInFile(file, Closure replaceText) { 
    file.write(replaceText(file.text)) 
} 

def file = new File('abc.txt') 
def patternToFind = ~/ConfigurablePart/ 
def patternToReplace = 'NewItem' 

//Call the method 
replacePatternInFile(file){ 
    it.replaceAll(patternToFind, patternToReplace) 
} 

println file.getText() 

//Prints: 
abc.item.1 = someDummyItem1 
abc.item.2 = someDummyItem2 
abc.item.3 = someDummyItem3 
alpha.beta.gamma.1 = constantPart1NewItem1 
alpha.beta.gamma.2 = constantPart2NewItem2 
alpha.beta.gamma.3 = constantPart3NewItem3 
abc.item.4 = someDummyItem4 
abc.item.5 = someDummyItem5 
abc.item.6 = someDummyItem6 

file di Conferma abc.txt. Non ho usato il metodo updateFile() come fatto da voi, ma si può benissimo parametrizzare come di seguito: -

def updateFile(file, patternToFind, patternToReplace){ 
    replacePatternInFile(file){ 
     it.replaceAll(patternToFind, patternToReplace) 
    } 
} 
+1

Sequenzialmente, non simultaneamente ;-) –

+0

@tim_yates Buona cattura. Aggiornato istantaneamente. : P – dmahapatro

+0

Dato che ho avuto più pattern, ho usato l'approccio Map dalla prima risposta come un ottimo modo per fornire i Pattern e i Sostituzioni alla tecnica di cui sopra. – JoeG

3

Per una risposta rapida che avevo appena seguire questa strada:

patterns = [pattern1 : constantPart1ConfigurablePart1, 
    pattern2 : constantPart2ConfigurablePart2, 
    pattern3 : constantPart3ConfigurablePart3] 


def myFile = new File(".", "inputs/fileInherited.txt") 
StringBuffer updatedFileText = new StringBuffer() 
def ls = System.getProperty('line.separator') 
myFile.eachLine{ line -> 
    patterns.each { pattern, replacement -> 
     line = line.replaceAll(pattern, replacement) 
    } 
    println line 
    updatedFileText.append(line).append(ls) 
} 
myFile.write(updatedFileText.toString()) 
+0

Se hai bisogno di farlo in luogo guardare a- http: // blog.davidehringer.com/groovy/processing-files-place-groovy/ –

+2

Vorrei poter controllare entrambe le risposte, ho usato principalmente la soluzione qui sotto, ma ho combinato il tuo approccio con la mappa del pattern - molto bello - grazie! – JoeG

Problemi correlati