0

データベースからエクスポートしたテキスト ファイルにフィールドがあります。フィールドには住所が含まれていますが、非常に長い場合があり、データベースでは複数の行を含めることができます。エクスポートすると、改行文字は次のようにドル記号に置き換えられます。

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

すべての住所に複数の行があるわけではなく、3 行を超える住所はありません。各行の長さは可変です。

メールマージに使用されるMS Accessにインポートするためにデータをマッサージしています。$ 記号がある場合はフィールドを分割したいが、フィールドに 1 行しか含まれていない場合は、2 つの追加の出力フィールドを長さゼロの文字列に設定して、アドレスに空白行が含まれないようにしたい印刷されたとき。

テキストファイル内の他のすべてのデータに対して正しく機能している awk ファイルがありますが、この最後のビットを機能させる必要があります。以下のコードを試しました。else で構文エラーが発生するという事実は別として、これが自分のやりたいことを行う良い方法かどうかはわかりません。これは Windows 上の gawk で行われています。

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

編集:申し訳ありません。これがサンプルです

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

HEADER を含まない行のみに一致します。$ 記号でテキスト文字列を分割する必要があります。パイプ間の文字列をパディングしないでください (これが、元のコードで長さを取得しようとした理由です)。この例では、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|

それが役立つことを願っています! これがまだ明確でない場合はお知らせください。

4

1 に答える 1

0
BEGIN { FS = "|" }
$1 != "HEADER" {
    for(i = gsub(/\$/, "\t", $6); i < 3; i++)
        $6 = $6 "\t"
    print $6
}

ただし、要件が正しいかどうかはわかりません。

于 2011-02-10T20:11:13.453 に答える