• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlを使ったファイルの入出力について)

perlを使ったファイルの入出力について

このQ&Aのポイント
  • Perlを利用して、特定の拡張子を持つデータファイルをディレクトリから読み込み、データをソートして出力する方法について質問します。
  • ディレクトリ内に存在するデータファイルの名前を変更せずに、Perlを使用してデータ整理を行う方法について教えてください。
  • 具体的な要件として、ディレクトリ内のaaa.data, bbb.data, ccc.dataなどのデータファイルを読み込み、それぞれをaaa.txt, bbb.txt, ccc.txtといった名前で出力したいです。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

以下のようにしてください。 -------------------------------- use strict; use warnings; #ソートルーチン sub mysort{ $a cmp $b; } opendir(DIR,"."); my @dirfiles = readdir(DIR); closedir(DIR); my @files = grep(/\.data$/,@dirfiles); foreach my $file (@files){ open(FH,$file); my @lines = <FH>; close(FH); my @newlines = sort mysort @lines; my $newfile = $file; $newfile =~ s/\.data$/.txt/; open(OFH,">$newfile"); print OFH @newlines; close(OFH); } ----------------------------------------- 上記のスクリプト(goo.plとします)を aaa.dataと同じディレクトリにおいてください。 そのディレクトリ下で perl goo.pl と入力してください。 ソートされた aaa.txt ・・・ zzz.txtが作成されます。 ソートは1行をまるごとソートしています。(文字として比較) もし、ソートの方法で、別な方法を希望の場合は、その旨補足してください。 windows7 perl 5.14 で動作確認済みです。

longren930
質問者

お礼

tatsu99さんのコードを参考にスクリプトを作らせていただきました。 何とか完成できたのでよかったです^^ありがとうございました。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

ちょいと突っ込ませてもらいますが>#5, 例えば >foo.data って名前のファイルがあったら破綻しちゃいますね (だから 2引数の open は使うなと...). あと, 最終行に改行がないと困るかも.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

同意>#3. あとは Perl のバージョンや「何を基準にしてソートするのか」によるかなぁ. ぶっちゃけ「ソート→表示」は print $fo sort <$fi>; で終わりかねないし.

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> dataファイルの抽出→ > aaa.dataファイルのソートとaaa.txtファイルの出力→ > bbb.dataファイルのソートとbbb.txtファイルの出力→ >: > zzz.dataファイルのソートとzzz.txtファイルの出力 下手に「効率のいい方法」なんて考えているより、この方法で作ってしまった方が早いです。 datasort (入力ファイル名, 出力ファイル名) みたいな感じでソートするsubを作って opendir→readdir や、 FIle::Glob 等でファイル一覧を取得 → 正規表現なりsubstrなりを使って出力ファイル名を生成 → datasortの引数にわたす で簡単にできるのではないでしょうか。 http://perldoc.perl.org/functions/opendir.html http://perldoc.perl.org/functions/glob.html http://perldoc.perl.org/File/Glob.html また、1ファイル分だけのPerlスクリプトを作って、 バッチファイルやシェルスクリプトの機能で全ファイルについて処理する、という方法もあります。

longren930
質問者

お礼

バッチファイルなどの機能は知りませんでした。 今回はperlだけでやってみましたが、時間があるときにでも試してみます^^ ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「全てのデータに対して」があいまいなんですよ. ファイルごとにソートする (つまりソートの回数はファイル数と同じ) のですか? それとも, すべてのファイルのデータをまとめて 1つとしてソートする (ソートは 1回だけ) のですか?

longren930
質問者

補足

説明不足でした。申し訳ありません。 ファイルごとにソートしようと考えています。 以下の手順で試みているところです。 .dataファイルの抽出→ aaa.dataファイルのソートとaaa.txtファイルの出力→ bbb.dataファイルのソートとbbb.txtファイルの出力→ : zzz.dataファイルのソートとzzz.txtファイルの出力 なので、読み取るファイルの数=ソートの回数(ソートの対称となるファイルの数)=出力ファイルの数 となるようにしたいと考えています。 ただ、他によりよい手順があればご教授願います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

2 の「ソート」は, 各ファイルごとにするってことでいい?

longren930
質問者

補足

> Tacosan 2のデータソートでは全てのデータに対して同じ操作を行います。

関連するQ&A