- ベストアンサー
テキストファイルへ行指定でのコピー方法
pass.cgiには100行までのデータが保存されています。pass.cgiに書き込まれている30行までのデータをdata.txtにコピーしたい場合はどのように書けばいいのでしょうか。初めて最初から自作CGI作りに挑戦して、皆さんのお力をおかりし作りたいCGIは完成しました。そしてこの機能が追加されれば更に便利になるためWEBで検索しましたが、わかりませんでした。よろしくお願いいたします。 $pass = 'pass.cgi'; if(open(DATA, ">>data.txt")){ print DATA ""; close(DATA); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
$を忘れていましたか(^^; 訂正ありがとうございます。 追加の件ですが、foreachのところだけ書きますね。 1つ目と4つ目の間のデータの区切りを 仮に半角スペース1つとして、 毎行の最後に改行コードを入れてみました。 ------------- foreach( @f_data ){ #30行超えたら処理を抜ける if( $i > 30 ){ last; } #一行の内容を<>で分割して、先頭4つを変数に取る ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); #1つ目と4つ目を書き出す print "$f_data1 $f_data4\n"; $i++; }
その他の回答 (1)
- o84
- ベストアンサー率31% (128/407)
今ちゃらっと書いただけで実行していませんので エラーになったらごめんなさい。 open( IN, "pass.cgi" ); @f_data = <IN>; close( IN ); i = 1 #書き出し先ファイルをオープン open( OUT, ">>data.txt" ); select OUT; foreach( @f_data ){ #30行超えたら処理を抜ける if( i > 30 ){ last; } print; i++; } #書き出し先ファイルを閉じる select STDOUT; close( OUT );
お礼
open( IN, "ranking1.cgi" ); @f_data = <IN>; close( IN ); $i = 1; #書き出し先ファイルをオープン open( OUT, ">>data.txt" ); select OUT; foreach( @f_data ){ #30行超えたら処理を抜ける if( $i > 30 ){ last; } print; $i++; } #書き出し先ファイルを閉じる select STDOUT; close( OUT ); ご回答有難うございます。上記のように書き換えたところエラーが表示されなくなりました。7行までのデータがdata.txtに記録されております。ログデータは以下の通りです。 100<><><>Named<>aaa<><> <>1163979601<><>127.0.0.1<> 95<><><>Name<>aaa<><> <>1163973570<><>127.0.0.1<> 95<><><>Namef<>aaa<><> <>1164141553<><>127.0.0.1<> 43<><><>Namec<>aaa<><> <>1163979531<><>127.0.0.1<> 19<><><>Nameb<>aaa<><> <>1163970514<><>127.0.0.1<> 15<><><>Namea<>aaa<><> <>1163962024<><>127.0.0.1<> 5<><><>Namee<>aaa<><> <>1163980638<><>127.0.0.1<> ↑再度のお願いで申し訳ないのですが、pass.cgiのログデータ上位30行を抜き出すさいに、更に一番左にある数字と名前の部分(ログ1番目と4番目)だけを抜き出して、data.txtに書き出すことはできないでしょうか。
補足
申し訳ございません、再度確認しましたところ、30行まで記録されておりました。以下お礼へ書かせていただきました追加要望を引き続きよろしくお願いいたします。
お礼
ご丁寧なご回答に感謝致します。おかげ様でスクリプトを完成させることができました。