• 締切済み

ファイル縦横変換

環境は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

みんなの回答

回答No.5

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

回答No.4

間違った。前のでも動くけど、とりあえず (表示がくずれるの空白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

get_taka
質問者

補足

素人で大変申し訳ないのですが 実行してみたところ以下のようなエラーが出てしましました。 $ 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 これはどのような意味でしょうか?

回答No.3

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)
回答No.2

Perl ならまずできるでしょう. 変な文字コードを持ってこられたら困るかもしれんが. シェルでできるかどうかは, たぶんシェルしだい. 大抵のシェルでできそうだけど, できないシェルがあっても驚きではないな.

回答No.1

プログラムでも可能だとは思いますが、 そのテキストファイルがTAB区切りか、スペース合わせで作成されているのなら、 EXCELが使えるパソコンに持って行って、縦横を入れ替えれば一瞬です。 その後、csvで吐き出して、SQLLoaderでも使えばそのまま取り込めるのではないでしょうか。

参考URL:
http://itpro.nikkeibp.co.jp/article/COLUMN/20060518/238339/

関連するQ&A