アプリ版:「スタンプのみでお礼する」機能のリリースについて

perl 初心者です。

perl を使ってデータ整理を試みていますが、方法がわからなくて困っています。

やりたい操作は、
1、ディレクトリ内にある特定の拡張子をもつすべてのデータファイルを読み込む
2、データソート
3、データファイル名を変更せずに、ソートしたデータを出力する


ディレクトリに以下のデータファイルがあるとします
aaa.data
bbb.data
ccc.data
:
zzz.data

これらのデータファイルをすべて読み込み、中身を整理した後に
aaa.txt
bbb.txt
ccc.txt
:
zzz.txt

となるように、それぞれのデータの名前を変更せずに出力したいと思っています。
スクリプトのサンプルなんかがあればありがたいです。

A 回答 (6件)

以下のようにしてください。


--------------------------------
usestrict;
usewarnings;
#ソートルーチン
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 で動作確認済みです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/07 14:05

ちょいと突っ込ませてもらいますが>#5, 例えば


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

同意>#3. あとは Perl のバージョンや「何を基準にしてソートするのか」によるかなぁ. ぶっちゃけ「ソート→表示」は


print $fo sort <$fi>;
で終わりかねないし.
    • good
    • 0

> 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スクリプトを作って、 バッチファイルやシェルスクリプトの機能で全ファイルについて処理する、という方法もあります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/07 14:07

「全てのデータに対して」があいまいなんですよ.



ファイルごとにソートする (つまりソートの回数はファイル数と同じ) のですか? それとも, すべてのファイルのデータをまとめて 1つとしてソートする (ソートは 1回だけ) のですか?

この回答への補足

説明不足でした。申し訳ありません。

ファイルごとにソートしようと考えています。
以下の手順で試みているところです。

.dataファイルの抽出→
aaa.dataファイルのソートとaaa.txtファイルの出力→
bbb.dataファイルのソートとbbb.txtファイルの出力→

zzz.dataファイルのソートとzzz.txtファイルの出力

なので、読み取るファイルの数=ソートの回数(ソートの対称となるファイルの数)=出力ファイルの数
となるようにしたいと考えています。

ただ、他によりよい手順があればご教授願います。

補足日時:2013/09/30 18:48
    • good
    • 0

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

この回答への補足

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

補足日時:2013/09/30 13:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!