Эффективное расщепление элементов в поле - PullRequest
0 голосов
/ 12 апреля 2010

У меня есть поле в текстовом файле, экспортируемом из базы данных. Поле содержит адреса, но иногда они довольно длинные, и база данных позволяет им содержать несколько строк. При экспорте символ новой строки заменяется знаком доллара, например:

first part of very long address$second part of very long address$third part of very long address

Не каждый адрес имеет несколько строк, и ни один адрес не содержит более трех строк. Длина каждой строки является переменной.

Я собираю данные для импорта в MS Access, который используется для mailmerge. Я хочу разделить поле на знаке $, если оно есть, но если поле содержит только 1 строку, я хочу установить в моих двух дополнительных выходных полях строку нулевой длины, чтобы в адресе не было пустых строк когда это будет напечатано.

У меня есть файл awk, который корректно работает со всеми другими данными в текстовом файле, но мне нужно, чтобы этот последний бит работал. Я попробовал приведенный ниже код. Помимо того, что я получаю синтаксическую ошибку, я не уверен, что это хороший способ сделать то, что я хочу. Это делается с помощью gawk в Windows.

BEGIN { FS = "|" }
$1 != "HEADER" {
    if ($6 ~ /\$/)
        split($6, arr, "$")
        address = arr[1]
        addresstwo = arr[2]
        addressthree = arr[3]
        addressLength = length(address)
        addressTwoLength = length(addresstwo)
        addressThreeLength = length(addressthree)

    else {
        address = $6
        addressLength = length($6)
        addresstwo = ""
        addressTwoLength = length(addresstwo)
    addressthree = ""
        addressThreeLength = length(addressthree)
        }

    printf("%*s\t%*s\t\%*s\n",
          addressLength, address, addressTwoLength, addresstwo, addressThreeLength, addressthree)
}

EDIT: Извини за это. Вот образец

HEADER|0000000130|0000527350|0000171250|0000058000|0000756600|0000814753|0000819455|100106
rec1|ILL/COLORADO COLLEGE$TUTT LIBRARY|1021 N CASCADE$COLORADO SPRINGS, CO 80903|
rec2|ILL /PIKES PEAK LIBRARY DISTRICT|20 N. CASCADE AVE. / PO BOX 1579$COLORADO SPRINGS, CO 80903|
rec3|DOE,JOHN|PO Box 8034|
rec4|ILL/GEORGIA INSTITUTE OF TECHNOLOGY|INFORMATION DELIVERY DEPT$704 CHERRY ST$ATLANTA, GA 30332-0900

Я сопоставляю только строки без заголовка в них. Мне нужно разбить текстовые строки на знаки $. Строка между каналами не должна быть дополнена (именно поэтому я пытался получить длину в моем исходном коде). Для этого примера есть 6 выходных полей, и любое поле, для которого нет данных, является просто пустой строкой (также то, что я пытался сделать в коде).

rec1|ILL/COLORADO COLLEGE|TUTT LIBRARY|1021 N CASCADE|COLORADO SPRINGS, CO 80903||
rec2|ILL /PIKES PEAK LIBRARY DISTRICT||20 N. CASCADE AVE. / PO BOX 1579|COLORADO SPRINGS, CO 80903||
rec3|DOE,JOHN||PO Box 8034|||
rec4|ILL/GEORGIA INSTITUTE OF TECHNOLOGY||INFORMATION DELIVERY DEPT|704 CHERRY ST|ATLANTA, GA 30332-0900|

Надеюсь, это поможет! Дайте мне знать, если это все еще не ясно.

1 Ответ

0 голосов
/ 10 февраля 2011
BEGIN { FS = "|" }
$1 != "HEADER" {
    for(i = gsub(/\$/, "\t", $6); i < 3; i++)
        $6 = $6 "\t"
    print $6
}

Я не совсем уверен, правильно ли я понял ваши требования.

...