Groovy:替换列表并为每一行创建一个列表

时间:2011-11-29 19:19:46

标签: list groovy replace

我尝试在列表中的结果中替换一些'。但它并没有取代这个迹象。

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

这是实际结果: [03.10.2011,'993413376204340783',13,087,0400102134,0060000390]

我一直在寻找:[03.10.2011,993413376204340783,13,087,0400102134,0060000390]

下一步是,当程序找到多个结果时,它应该在一个多列表中?

像这样:

[[03.10.2011,'993413376204340783',13,087,0400102134,0060000390] [03.10.2011,'993413376204340783',13,087,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

有成千上万的条目

2 个答案:

答案 0 :(得分:1)

也许让蒂姆的帖子更加清晰......你的

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

意味着您将转换String [],由于之前的拆分而存储在linesAsList中,创建一个String,然后使用replace。结果再次是一个String,它将被转换为List。此List将包含String on char元素中的每个char。我很确定这不是你想要的。但它实际上并不重要,因为结果没有分配。那简直就是被遗忘了。所以

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

你需要

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

结果就是一个清单。

我正在添加更多内容,以便您可以更好地理解Tim的代码,而不是替代解决方案。 Tim也用多个结果解决了这个案例

答案 1 :(得分:0)

是的,你的代码有点混乱,而且我很确定它的一部分不起作用,但是给出了这个标签分隔文件(我编写的)

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