- 締切済み
ファイル縦横変換
環境はUNIXです。 以下のようなテキストファイルを 変換してOracleのテーブルに 取込みたいのですがよい方法をご存知の方 いらっしゃいませんでしょうか? まずはテキストファイルを変換前の状態から 変換後のようにしたいのです。 シェルまたはPerlで実現可能でしょうか? <変換前> 地域名称 コーラ お茶 ミルク 北海道 10,000 20,000 30,000 青森 10,000 20,000 30,000 <変換後> 北海道 コーラ 10,000 北海道 お茶 20,000 北海道 ミルク 30,000 青森 コーラ 10,000 青森 お茶 20,000 青森 ミルク 30,000
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- _--_1l1_1_
- ベストアンサー率67% (102/152)
bash入ってないかbashのバージョンが古いか。たぶんbashのバージョンが古いと思う。bashのバージョンが古いと配列が使えないから。 $ bash --version GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu) Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. $ bash foo.sh < foo.txt 北海道 コーラ 10,000 北海道 お茶 20,000 北海道 ミルク 30,000 青森 コーラ 10,000 青森 お茶 20,000 青森 ミルク 30,000
- _--_1l1_1_
- ベストアンサー率67% (102/152)
間違った。前のでも動くけど、とりあえず (表示がくずれるの空白2文字を全角空白で書いていることに注意) #!/bin/bash DELIMITER=' ' read line IFS_ORIG=$IFS IFS=$DELIMITER set -- $line IFS=$IFS_ORIG shift items=("$@") while read line; do IFS_ORIG=$IFS IFS=$DELIMITER set -- $line IFS=$IFS_ORIG region=$1 shift prices=("$@") for ((i = 0; i < ${#prices[*]}; i++)) { echo "$region ${items[$i]} ${prices[$i]}" } done
- _--_1l1_1_
- ベストアンサー率67% (102/152)
bash で書いてみたが、 perl の方がはるかに楽だな。 --- foo.sh (表示がくずれるの空白2文字を全角空白で書いていることに注意) #!/bin/bash DELIMITER=' ' read line IFS_ORIG=$IFS set -- $line IFS=$IFS_ORIG shift items=("$@") while read line; do IFS_ORIG=$IFS set -- $line IFS=$IFS_ORIG region=$1 shift prices=("$@") for ((i = 0; i < ${#prices[*]}; i++)) { echo "$region ${items[$i]} ${prices[$i]}" } done --- foo.txt(デリミタを空白に変更) 地域名称 コーラ お茶 ミルク 北海道 10,000 20,000 30,000 青森 10,000 20,000 30,000 --- result $ sh foo.sh < foo.txt 北海道 コーラ 10,000 北海道 お茶 20,000 北海道 ミルク 30,000 青森 コーラ 10,000 青森 お茶 20,000 青森 ミルク 30,000
- Tacosan
- ベストアンサー率23% (3656/15482)
Perl ならまずできるでしょう. 変な文字コードを持ってこられたら困るかもしれんが. シェルでできるかどうかは, たぶんシェルしだい. 大抵のシェルでできそうだけど, できないシェルがあっても驚きではないな.
- duke_kimura
- ベストアンサー率39% (53/134)
プログラムでも可能だとは思いますが、 そのテキストファイルがTAB区切りか、スペース合わせで作成されているのなら、 EXCELが使えるパソコンに持って行って、縦横を入れ替えれば一瞬です。 その後、csvで吐き出して、SQLLoaderでも使えばそのまま取り込めるのではないでしょうか。
補足
素人で大変申し訳ないのですが 実行してみたところ以下のようなエラーが出てしましました。 $ foo.sh < foo.txt foo.sh: line 20: syntax error near unexpected token `"$@"' foo.sh: line 20: ` prices=("$@")' $ sh foo.sh < foo.txt foo.sh: 構文エラー 行 11: `items=' unexpected これはどのような意味でしょうか?