2011-11-29 93 views
0

我嘗試替換列表中的某個結果。但它並沒有取代這種跡象。Groovy:在列表中替換併爲每一行創建一個列表

   linesAsList = lines.toString().split('\t|\r') 
      linesAsList.toString().replaceAll(("'"),("")) as List 

這是實際的結果是: [03.10.2011, '993413376204340783',13087,0400102134,0060000390]

我一直在尋找這樣的:[03.10.2011,993413376204340783,13087,0400102134, 0060000390]

下一步是,當程序找到多個結果時,它應該在一個多重列表中?

像這樣:

[03.10.2011, '993413376204340783',13087,0400102134,0060000390] [03.10.2011, '993413376204340783',13087,0400102134,0060000390]

是這樣真的可能嗎?我該怎麼做。在他們之後,我正在構建一個用於創建xml的循環。

如果你需要它,這是整個代碼:

import groovy.util.CharsetToolkit; 
import java.lang.Object 

//Generate pathname 
//Pfadname generiert für einfacheres ändern des Speicherortes 
def pathname = "C:/mySupport-eclipse/trackandtrace.txt" 
//Define Error Status 
//Error Status definieren für Weiterverabeitung in mySupport 
int errorCode = 0 
def errorMessage = "" 

def linesAsList = [] 


def bsknr = "0060000390" 
//Define new Fiel 
//Neue Datei definieren 
def file = new File(pathname) 

if(!file.exists()) 
{ 
    errorCode = 1 
    errorMessage = "File not found" 
    out_xml = xmlGenerieren() 
} 
else 
{ 
    //Read Roews and look for BSK Number, split after tab 
    //Zeilen einlesen und nach der BSK Nummer suchen, nach dem Tabulator trennen 
    def lines = file.filterLine { 
     line -> line ==~ /.*\t${bsknr}\t.*/ 

     } 
    //Split the result after tab and enter, give back as String 
    //Das Ergebnis aufteilen bei Tabulator und Enter und zugleich als String zurückgeben 

    linesAsList = lines.toString().split('\t|\r') 
    linesAsList.toString().replaceAll(("'"),("")) as List 
    //Give date, sendnr. and date 
    //Liefere nur Datum, Sendungsnummer und Gewicht 
    linesAsList = linesAsList[0,1,2,4,5,6] 
    xmlGenerieren(linesAsList) 
     //println linesAsList 
    } 

def xmlGenerieren(List linesAsList) { 
def writer = new StringWriter() 
def builder = new groovy.xml.MarkupBuilder(writer) 
linesAsList.pop() 


println linesAsList 
def listsize = linesAsList.size() 


//Test if is empty 
//Prüfen ob gültige Ergebnise gefunden wurden 
if (listsize >= 5 || listsize %5) 
{ 
    long i = 0 
    long anzEintraege = listsize % 5 
    while (i <= anzEintraege) 
    { 
    builder.result() 
    { 
     entry(wert:i) 
     { 
      paketnr(linesAsList[1]) 
     } 
    } 
    println writer.toString() 
    errorCode = 0 
    i++ 
    } 
} 
else { 

println listsize 
//i = listsize/8 
//println i 

} 

} 

輸入的例子:

Filterkriterien:Frachtfuehrer: POSTCH Auftraggeber: Testfirma Zeitraum: 01.10.2011 - 31.10.2011 

ZeitraumVonBis PaketNr Gewicht Gebühr Lierf. Nr KundenNr AuftragsNr Name1 Name2 Str Plz Ort Lkz Versandart 
03.10.2011 '993413376204340260' 1,000 0,00 0400102100 0052662182  John Doe  Streetname 10 3018 Bern CH Priority SI 
03.10.2011 '993413376204340783' 13,087 0,00 0400102134 0060000390  Swisscom Schweiz AG Johnny Doe Streetname 51 3050 Bern CH Priority SI 

有條目

+0

不給我們幾個例子輸入文件行? –

+0

當然,我已經更新了帖子末尾 – CollinG

回答

0

權tousands,你的代碼是有點一個爛攤子,我敢肯定它的一部分將無法正常工作,但給了這個選項卡分開的文件(我編造)

03.10.2011 '993413376204340783' 13,087 0400102134 0060000390 
04.10.2011 '993413376204341783' 13,087 0400102134 0060000391 
05.10.2011 '993413376204342783' 13,087 0400102134 0060000392 
06.10.2011 '993413376204340783' 13,087 0400102134 0060000390 
07.10.2011 '993413376204343783' 13,087 0400102134 0060000392 

這似乎這樣做你想要的東西:

//Generate pathname 
//Pfadname generiert für einfacheres ändern des Speicherortes 
String pathname = 'file.txt' 

//Define Error Status 
//Error Status definieren für Weiterverabeitung in mySupport 
int errorCode = 0 
String errorMessage = '' 

def bsknr = "0060000390" 

//Define new Fiel 
//Neue Datei definieren 
File file = new File(pathname) 

if(!file.exists()) 
{ 
    errorCode = 1 
    errorMessage = "File not found" 
    out_xml = xmlGenerieren() 
} 
else 
{ 
    //Read Roews and look for BSK Number, split after tab 
    //Zeilen einlesen und nach der BSK Nummer suchen, nach dem Tabulator trennen 
    String filteredLines = file.filterLine { line -> 
    line.split(/\t/).grep(bsknr) 
    } 
    //Split the result after tab and enter, give back as String 
    //Das Ergebnis aufteilen bei Tabulator und Enter und zugleich als String zurückgeben 
    linesAsList = filteredLines.split(/\n|\r|\n\r|\r\n/)*.split(/\t/)*.collect { it.replace("'", '') } 

    //Give date, sendnr. and date 
    //Liefere nur Datum, Sendungsnummer und Gewicht 
    linesAsList = linesAsList*.getAt([ 0,1,2,4,5,6 ]) 
    out_xml = xmlGenerieren(linesAsList) 
} 

println out_xml 

def xmlGenerieren(List linesAsList) { 
    println linesAsList 
    new StringWriter().with { writer -> 
    new groovy.xml.MarkupBuilder(writer).with { mb -> 
     result { 
     linesAsList.eachWithIndex { line, index -> 
      mb.entry(wert:index) { 
      mb.paketnr(line[ 1 ]) 
      } 
     } 
     } 
    } 
    writer.toString() 
    } 
} 
+0

非常感謝你。這正是我需要的。現在比較複雜,但我認爲它很完美。所以現在我試着去看看全新的代碼行,以後我可以在沒有幫助的情況下使用它。再次感謝tim – CollinG

+0

所以,現在我明白了代碼,但是我在每行之後都有一個空列表,當我在\ r \ t之後進行拆分時,如何刪除空條目?我試過findAll {item - >!item.isEmpty()} 並刪除。但是這不起作用:/ – CollinG

+0

代碼不會在\ r \ t之後分割...如果您得到空白條目,我猜你或者在輸入文件中有我不知道的情況(你沒有指定),或者你使用的代碼是不同的? –

1

到也許使蒂姆後就更清楚了......你

linesAsList.toString().replaceAll(("'"),("")) as List 

意味着你將轉換的String [],即被存儲在linesAsList中,因爲之前已經分割,創建一個String,然後使用replace。然後結果是一個字符串,它將被轉換爲一個List。此列表將包含字符元素中字符串中的每個字符。我很確定這不是你想要的。但實際上並不重要,因爲結果是無處分配的。那簡直就是忘記了。所以經過

linesAsList = lines.toString().split('\t|\r') 

你需要

linesAsList = linesAsList*.replaceAll(("'"),("")) 

結果是那麼的列表。

我添加了更多,所以你可以更好地理解蒂姆的代碼,而不是作爲替代解決方案。還蒂姆解決了多個結果的情況下

+0

+1中分離出一個,因爲這可能有助於Collin查看哪些問題比我的代碼堆更好;-) –

相關問題