1

以下に、必要なファイルと、さらに下に、これまでに作成したファイルを示します。私のコードでは、区切り文字が問題の原因であると思いますが、それをはるかに改善することはできません。

私のソースファイルは;区切り文字として使用され、データベースのファイルには区切り文字として使用されます,。また、文字列は「」の間にあります。

カテゴリファイルは次のようになります。

"1","1","testcategory","testdescription"

そして、メーカーは次のようにファイルします:

"24","ASUS",NULL,NULL,NULL
"23","ASROCK",NULL,NULL,NULL
"22","ARNOVA",NULL,NULL,NULL

私が現時点で持っているもの:

- category file:
1;2;Alarmen en beveiligingen;
2;2;Apparatuur en toebehoren;
3;2;AUDIO;

- manufacturers file:
315;XTREAMER;NULL;NULL;NULL
316;XTREMEMAC;NULL;NULL;NULL
317;Y-CAM;NULL;NULL;NULL
318;ZALMAN;NULL;NULL;NULL

少し使ってみましたsed; まず、カテゴリファイルで:

cut -d ";" -f1 /home/arno/pixtmp/pixtmp.csv |sort | uniq >        /home/arno/pixtmp/categories_description-in.csv
sed 's/^/;2;/g' /home/arno/pixtmp/categories_description-in.csv > /home/arno/pixtmp/categories_description-in.tmp
sed -e "s/$/;/" /home/arno/pixtmp/categories_description-in.tmp > /home/arno/pixtmp/categories_description-in.tmp2
awk 'BEGIN{n=1}{printf("%s%s\n",n++,$0)}' /home/arno/pixtmp/categories_description-in.tmp2 > /home/arno/pixtmp/categories_description$

そして、メーカーのファイルで:

cut -d ";" -f5 /home/arno/pixtmp/pixtmp.csv |sort | uniq > /home/arno/pixtmp/manufacturers-in
sed 's/^/;/g' /home/arno/pixtmp/manufacturers-in > /home/arno/pixtmp/manufacturers-tmp
sed -e "s/$/;NULL;NULL;NULL/" /home/arno/pixtmp/manufacturers-tmp > /home/arno/pixtmp/manufacturers-tmp2
awk 'BEGIN{n=1}{printf("%s%s\n",n++,$0)}' /home/arno/pixtmp/manufacturers-tmp2 > /home/arno/pixtmp/manufacturers.ok
4

1 に答える 1

2

あなたはcut、sed、AWKを使って問題を解決しようとしていました。AWK自体は、問題を解決するのに十分強力です。

両方の例を処理できる1つのAWKプログラムを作成しました。NULLが特殊なケースではなく、製造元のファイルの形式が異なる場合は、2つのAWKプログラムを作成する必要がありますが、その方法は明確であると思います。

ここで行うのは、「フィールド区切り文字」がセミコロンであることをAWKに伝えることだけです。次に、AWKは入力行をフィールドに分割します。フィールドをループし、印刷しながら進みます。

#!/usr/bin/awk -f

BEGIN {
    FS = ";"

    DQUOTE = "\""
}

function add_quotes(s) {
    if (s == "NULL")
        return s
    else
        return DQUOTE s DQUOTE
}

NF > 0 {
    # if input ended with a semicolon, last field will be empty
    if ($NF == "")
        NF -= 1  # subtract one from NF to forget the last field

    if (NF > 0)
    {
        for (i = 1; i <= NF - 1; ++i)
            printf("%s,", add_quotes($i))
        printf("%s\n", add_quotes($i))
    }
}
于 2013-01-24T00:43:28.443 に答える