2009-06-18 5 views
6

codice attuale:Groovy concatenazione di stringhe

row.column.each(){column -> 
    println column.attributes()['name'] 
    println column.value() 
} 

Column è un Node che ha un singolo attributo e un singolo valore. Sto analizzando un XML per inserire creare istruzioni di inserimento in accesso. C'è un modo Groovy per creare la seguente dichiarazione strutturata:

Insert INTO tablename (col1, col2, col3) VALUES (1,2,3) 

sto attualmente memorizzando l'attributo e il valore di separare gli array poi popping nell'ordine corretto.

risposta

18

Penso che possa essere molto più facile in groovy della risposta attualmente accettata. I metodi collect e join sono costruiti per questo tipo di cose. Partecipa si occupa automaticamente di concatenazione e anche non mettere la virgola finale sulla corda

def names = row.column.collect { it.attributes()['name'] }.join(",") 
def values = row.column.collect { it.values() }.join(",") 
def result = "INSERT INTO tablename($names) VALUES($values)" 
+1

Questo ha funzionato perfettamente! Perché il mio setup era table.row.column Ho usato $ {table.attributes() ['name']} per recuperare il tablename – XanderLynn

0

Si potrebbe usare solo due StringBuilder. Qualcosa di simile a questo, che è ruvida e non testato:

def columns = new StringBuilder("Insert INTO tablename(") 
def values = new StringBuilder("VALUES (") 
row.column.each() { column -> 
    columns.append(column.attributes()['name']) 
    columns.append(", ") 
    values.append(column.value()) 
    values.append(", ") 
} 
// chop off the trailing commas, add the closing parens 
columns = columns.substring(0, columns.length() - 2) 
columns.append(") ") 
values = values.substring(0, values.length() - 2) 
values.append(")") 

columns.append(values) 
def result = columns.toString() 

si possono trovare tutti i tipi di Groovy operatori manipolazione delle stringhe here.

+1

in Groovy è possibile aggiungere a uno StringBuilder utilizzando '<<' piuttosto che "append()", che rende il codice molto di più leggibile IMO –