質問: エクセルに次のようなCSVをインポートします。 項目A,項目B,項目C,項目D,単価A,単価B,単価C,単価D,数量A,数量B,数量C,数量D,金額A,金額B,金額C,金額D 項目X,項目Y,項目Z,単価X,単価Y,単価Z,数量X,数量Y,数量Z,金額X,金額Y,金額Z ・ ・ ・ これを、 項目A 単価A 数量A 金額A 項目B 単価B 数量B 金額B 項目C 単価C 数量C 金額C 項目D 単価D 数量D 金額D 項目X 単価X 数量X 金額X 項目Y 単価Y 数量Y 金額Y 項目Z 単価Z 数量Z 金額Z ・ ・ ・ のように並び替える方法はありませんか? ※VBAは後々メンテナンスできる人がいなくなるのが嫌なので使いたくありません 項目数は20くらいを上限に変動する前提です。
回答: gawkを使った並べ替え gawk ファイル:csvconv.awk ``` BEGIN { # 区切り文字 FS=","; # 各項目は4つのデータより項目+単価+数量+金額 # なる。 ITEM=4; } # 並び替え { # カラムがITEMより少ない場合は無視 if( NF < ITEM ) next; # 項目数がITEMの倍数ではない倍無視 if( (NF % ITEM)!=0 ) next; # 項目数を数える カラム数/項目 ITEMS=NF/ITEM; # 先頭は項目 for( i=1; i<= ITEMS;i++ ) { printf("%s",$i); # 各項目は繰り返し for( j=ITEMS+1; j<= NF; j+= ITEM ) { printf(",%s",$j); }; printf("\n"); }; } ``` DOSのコマンドラインで gawk -f csvconv.awk xxx.csv とすると画面変換されたものが 表示される 保存する場合は gawk -f csvconv.awk xxx.csv > yyy.csv のようにする