Что такое хорошая библиотека для анализа записей фиксированной длины в Groovy? - PullRequest
4 голосов
/ 12 октября 2011

Мне нужна библиотека, в которой я могу дать ей файл и параметр конфигурации с длиной столбца, именем и, возможно, типом, а затем получить карту столбцов каждой строки.

Это не 'Само по себе это сложно сделать, но я был бы удивлен, если бы не было отличного решения.Я пытался найти один, но мне не повезло.

Ответы [ 3 ]

3 голосов
/ 12 октября 2011

Я ничего не знаю специально для заводной. Я сделал нечто подобное с регулярными выражениями; вот быстрый и грязный парсер, основанный на этом подходе:

def input =
"JOHN      DOE       123       \n" +
"JANE      ROE       456       \n"

def fieldDefs = [firstName: 10, lastName: 10, someValue: 10]

def pattern = "^" + fieldDefs.collect { k, v -> "(.{$v})" }.join('') + "\$"

rows = []
input.eachLine { line ->
    def m = line =~ pattern
    if (m) {
        def names = fieldDefs.keySet() as List
        def values = m[0][1..-1].collect { it.trim() }
        rows << [names, values].transpose().collectEntries{it}
    }
}
2 голосов
/ 30 октября 2011

Вы всегда можете использовать FlatFileItemReader из Spring Batch, который будет возвращать структуру, подобную JDBC ResultSet.

Но это может быть излишним и усложнить его.Для Groovy мне легко читать и писать такой код:

file = '''\
JOHN      DOE       123       
JANE      ROE       456       
'''

names = []
file.eachLine { names << [
    first: it[0..9].trim(), 
    last:  it[10..19].trim(),
    age:   it[20..22].toInteger()
]}

assert names[0].first == 'JOHN'
assert names[1].age == 456
0 голосов
/ 02 января 2014

Только что протестировал это с помощью метода регулярных выражений и метода String getAt. getAt, кажется, примерно в 2 раза быстрее, чем регулярные выражения за 10k

def input = "";

for(i=1;i<10000;i++)
{
    input += "JOHN      DOE       123       \n"
}


def fieldDefs = [firstName: 10, lastName: 10, someValue: 10]


def benchmark = { closure ->
    start = System.currentTimeMillis()
    closure.call()
    now = System.currentTimeMillis()
    now - start
  }


def pattern = "^" + fieldDefs.collect { k, v -> "(.{$v})" }.join('') + "\$"

duration = benchmark {
    rows = []
    input.eachLine { line ->

        String firstName = line.getAt(0..9).trim();
        String lastName = line.getAt(10..19).trim();
        String someValue = line.getAt(20..29).trim();
        rows << ["firstName":firstName,"lastName":lastName,"someValue":someValue];
    }

    //println rows
    }


println "execution of string method took ${duration} ms"


def duration = benchmark {
rows = []
input.eachLine { line ->
    def m = line =~ pattern
    if (m) {
        def names = fieldDefs.keySet() as List
        def values = m[0][1..-1].collect { it.trim() }
        rows << [names, values].transpose().collectEntries{it}
    }
}

//println rows
}

println "execution of regex method took ${duration} ms"

выполнение строкового метода заняло 245 мс выполнение метода регулярных выражений заняло 505 мс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...