- ベストアンサー
テキストファイルの結合
はじめまして。配列とか変数でFORでループさせれ ばいいのかなと思うのですが変数の取り扱いがわ かりません。あるフォルダに拡張子なしの . の 後連番のテキストファイルがあります(SGML出力)。 その連番順にテキストを結合したファイルを作成 したい。 条件として"a086.xxx"のファイルについて処理し たいです。よろしくお願いします。 ファイル名 中身 a084.000 ............. a085.000 ............. a086.000 abc.......xxx a086.001 123.......xxx ・ ・ a086.036 xyz.......xxx a087.000 ............. 結合したファイルの中身 abc.......xxx 123.......xxx ・ ・ ・ xyz.......xxx フォルダの中のそのファイルの個数はその都度 違います。 下記のように処理したいファイル名は抽出して みたのですがその後どうすればいいのかわかり ません。また、ファイル名を抽出しないでその まま処理するものでしょうか。 opendir ( DIR , "a:\\S603000" ) or die; while($dir = readdir (DIR) ){ if ( $dir =~ /a086/ ){ print "$dir\n"; } } closedir ( DIR );
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
kinokoyasan2004さんのはいざファイルを開くとき、 open(IN,"$dir"); とやってしまっています。 これでは、Perlスクリプトが動いてるディレクトリに目的のファイルがないと意味がありません。 というわけで、 $indir = 'A:/S603000'; #探しに行くディレクトリ $outdir = './output.dat'; #書き出すファイル open(OUT,"> $outdir") or die $!; opendir(DIR, $indir) or die $!; while ($list = readdir(DIR)) { if(-f "$indir/$list" && $list =~ /^a086\.[^\.]+$/i){ open(IN, "< $indir/$list") or die $!; while (<IN>){print OUT;} close(IN); print OUT "\n"; } } closedir(DIR); close(OUT);
その他の回答 (2)
- kinokoyasan2004
- ベストアンサー率59% (16/27)
はじめまして。 抽出したファイル名をオープンして内容を読み込み、別のファイルに出力するって言う処理でいいんではないでしょうか。 自分なりにですが、コードを書いてみたんで、乗せておきますね。 open(OUT,"> output.dat"); #出力用ファイルオープン opendir ( DIR , "a:\\S603000" ) or die; while($dir = readdir (DIR) ){ if ( $dir =~ /a086/ ){ open(IN,"$dir"); #データファイル読み込み while($dat = <IN>){ print(OUT "$dat"); } close(IN); } } closedir ( DIR ); close(OUT); おそらく、これでできると思います。
お礼
まだ理解できてないのですが、回答戴き解決しました。 ありがとうございました。
補足
回答ありがとうございます。 そのまま実行するとブランクファイルが出来てしまいましたので、 処理ファイル抽出と読出し書出しにわけてコード見せて戴きました。 中途半端なコード書いたのが良くなかったかもしれません。 FDにあるS603000というディレクトリの中のa083.000から a086.XXX(XXXはその都度ちがいます。)のファイルに1行の テキストデータあるのでそれをファイル番号順に1行づつ 連結して出力ファイルにしたいのです。copy commandを 教わりました。テキストファイルの内容テキストをひたすら連結 しますが、それにファイルデータごとに改行を加えたいのです。 変数の扱いというか拾い出したデータから処理を進めていく とこでつまづいています(判りづらい説明すみません)。 コード間違って理解していたら申し訳ないのですが、再度 教えて戴けると助かります。
- GuruGuru22
- ベストアンサー率51% (177/346)
osはwindowsかな? copyコマンドで十分。perl出番なしかも。 コマンドプロンプトから copy a:\s603000\a086.* newfile.txt でOKかと。 perlでやるんだったら、該当するfile読み込んで 出力用のfileに吐き出せばいいのでは。
お礼
os書いてませんでした。windowsです。 copy command で出来るなんて思いつきもしなかった です。連結ソフトでやってみたりはしたんでが、 順番が狂ったり、読込みファイル数に制限があった りで困って今回投稿しました。 ただ、最終csv形式にしたいのでSGMLのタグの置換 処理と改行コードの追加も合わせてperlが良いのか なと思い手をつけてみました。 \nで改行コードも置換できそうですので.bat処理も も検討してみます。 ありがとうございます。
お礼
回答ありがとうございます。 欲しいテキストファイルが出来ました。 これで、一回の処理でエクセル利用出来ます。 kinokoyasan2004さんのコードの説明も ありがとうございます。 読込み書出しのとこのif部分あたり、本みながら 勉強させて貰います。