• ベストアンサー

データの並べ替え

すいません。もしかしたら出ている質問かもしれませんが見つからなかったので質問させてください。 やりたい事は、既存のCGIで出来たデータを新しいCGIに合う様に変換させたいです。 えっと、今使用しているCGIがあるのですが、別のCGIに変更したいと思っています。 で、今までのデータをそのまま使用したいのですが、やっぱり、データが入っている順番が違ったりします。 例えば 元)名前,mail,URL,コメント,Pass… 新)名前,pass,コメント,mail,url… こういうのを、新しい並びに一括変更するようなソフトって無いのでしょうか?新しいCGIのデータ書き込みを元のと同じように並べ替える手もあるとは思いますが、何か、新しい方は高性能そうなかんじのなので出きればデータのみを変更したいのです。 または、普段、こうしてるよ。とかご意見を聞かせていただけると嬉しいです。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • arcsin
  • ベストアンサー率70% (28/40)
回答No.3

#2です。さきほどの訂正です。 ーーーーーーーーーーーーーーーーーーーーーーーー open (LOG, "$old")||&error("can't open $logfile"); ↓ open (LOG, "$old")||&error("can't open $old"); #ここは、古いログファイルの並び。 #$nameには、「,」でくぎられた最初の文字列、 #$passには、「,」でくぎられた次の文字列 #がはいっていく。↓ ↓ #ここは、古いログファイルの並び。 #$nameには、「,」でくぎられた最初の文字列、 #$mailには、「,」でくぎられた次の文字列 #がはいっていく。↓

monica_panda
質問者

お礼

ご返答有難うございます。こちらのスクリプト使用させていただき、上手くいきました!!それに、何度も使えるので他のデータにも使えるし重宝しそうです。どうも有難うございました!!

monica_panda
質問者

補足

 } も、一つ多かったですね。修正までしていただき有難うございます。

その他の回答 (3)

回答No.4

簡単な変換プログラムを書いてしまった方が早いでしょう。 ex.test.pl use strict; open FILE, $ARGV[0]; open NEW, ">$ARGV[0].txt"; print NEW "$_\n" for map { ($_->[0],$_->[2]) = ($_->[2],$_->[0]); join "\t", @$_[0..$#$_]; } map { chomp; [split/\t/] } <FILE>; close NEW; close FILE; あとは、コマンドプロンプトから、 perl test.pl cgi_log.txt で実行してやればOKです。 上のはとりあえずtab区切りで、 ($_->[0],$_->[2]) = ($_->[2],$_->[0]); の行でデータを入れ替えています。 1個目と3個目を入れ替えている例(添え字なので、一つずれることに注意)

monica_panda
質問者

お礼

ご返答有難うございます。ただ、悲しいかな、プログラムを自分で組んだ事が無く、作成できませんでした。凄くよさそうなものだけに、使いこなせず申し訳ないです。いつか、プログラムの知識を持てるようになりましたらチャレンジさせて頂きます。有難うございました。

  • arcsin
  • ベストアンサー率70% (28/40)
回答No.2

ご自分でそいうCGIをつくるのも手かとおもいます。 おそらく掲示板かなんかのログファイルですよね? perlの知識がいりますが参考にしてみてください。 たとえば、monica_pandaさんがおっしゃているように、 元)名前,mail,URL,コメント,Pass 新)名前,pass,コメント,mail,url という風に変換したい場合、それぞれの情報が、という風に「,」でくぎっあるならば、 ************** change.cgi ****************** #!/usr/local/bin/perl #↓古いログファイル名を指定 $old= "bbs.log"; #↓新しいログファイル名を指定 $new = "newbbs.cgi"; print "Content-type: text/html\n\n"; open (LOG, "$old")||&error("can't open $logfile"); @lines = <LOG>; close(LOG); open (LOG, ">$new")||&error("can't write $new"); foreach (@lines) { $_ =~ s/\n//g; #ここは、古いログファイルの並び。 #$nameには、「,」でくぎられた最初の文字列、 #$passには、「,」でくぎられた次の文字列 #がはいっていく。↓ local($name,$mail,$url,$com,$pass) = split(/\,/,$_); #↓ここは、新しいログファイルの並び $_ = "$name,$pass,$com,$mail,$url\n"; } } print LOG @lines; close (LOG); print "Exit"; exit; sub error { print "$_[0]"; exit; } ************************************** というファイルを作成してアップロードし、ログファイルと同じディレクトリにいれて、実行してみるのはどうでしょうか。

回答No.1

 個々のデータがカンマで区切られていて、1レコードの最後に改行コードが入っているなら、CSVとしてExcelで読んでみてはどうでしょう?  Excelで列を入れ替えて、またCSVで吐き出す・・  一回きりの話なら、これでどうでしょうか?

monica_panda
質問者

お礼

ご返答有難うございます。エクセルがまだ使いこなせないので出来ませんでしたが、そういうやり方もあるんですね。今度、ゆっくり挑戦させていただこうと思います。有難うございました。