perl 初心者です。
perl を使ってデータ整理を試みていますが、方法がわからなくて困っています。
やりたい操作は、
1、ディレクトリ内にある特定の拡張子をもつすべてのデータファイルを読み込む
2、データソート
3、データファイル名を変更せずに、ソートしたデータを出力する
例
ディレクトリに以下のデータファイルがあるとします
aaa.data
bbb.data
ccc.data
:
zzz.data
これらのデータファイルをすべて読み込み、中身を整理した後に
aaa.txt
bbb.txt
ccc.txt
:
zzz.txt
となるように、それぞれのデータの名前を変更せずに出力したいと思っています。
スクリプトのサンプルなんかがあればありがたいです。
No.5ベストアンサー
- 回答日時:
以下のようにしてください。
--------------------------------
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 で動作確認済みです。
tatsu99さんのコードを参考にスクリプトを作らせていただきました。
何とか完成できたのでよかったです^^ありがとうございました。
No.6
- 回答日時:
ちょいと突っ込ませてもらいますが>#5, 例えば
>foo.data
って名前のファイルがあったら破綻しちゃいますね (だから 2引数の open は使うなと...). あと, 最終行に改行がないと困るかも.
No.4
- 回答日時:
同意>#3. あとは Perl のバージョンや「何を基準にしてソートするのか」によるかなぁ. ぶっちゃけ「ソート→表示」は
print $fo sort <$fi>;
で終わりかねないし.
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スクリプトを作って、 バッチファイルやシェルスクリプトの機能で全ファイルについて処理する、という方法もあります。
バッチファイルなどの機能は知りませんでした。
今回はperlだけでやってみましたが、時間があるときにでも試してみます^^
ありがとうございました。
No.2
- 回答日時:
「全てのデータに対して」があいまいなんですよ.
ファイルごとにソートする (つまりソートの回数はファイル数と同じ) のですか? それとも, すべてのファイルのデータをまとめて 1つとしてソートする (ソートは 1回だけ) のですか?
この回答への補足
説明不足でした。申し訳ありません。
ファイルごとにソートしようと考えています。
以下の手順で試みているところです。
.dataファイルの抽出→
aaa.dataファイルのソートとaaa.txtファイルの出力→
bbb.dataファイルのソートとbbb.txtファイルの出力→
:
zzz.dataファイルのソートとzzz.txtファイルの出力
なので、読み取るファイルの数=ソートの回数(ソートの対称となるファイルの数)=出力ファイルの数
となるようにしたいと考えています。
ただ、他によりよい手順があればご教授願います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける (再質問) 4 2022/09/14 22:51
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Excel(エクセル) 【エクセル】元データからの引用 5 2022/04/18 10:22
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelをCSV書き出す場合のシー...
-
ReadLineでの読み出し行を指定する
-
データファイルをプロットする(...
-
openした後、closeしないでプロ...
-
VBAでCSVファイルを途中行まで...
-
MATLAB グローバル変数の宣言
-
Perlの変数に文字数制限(容量...
-
VBAで巨大なファイルの途中から...
-
エクセルVBAでCSVファイ...
-
VBAでCSVファイルの特定行を書...
-
perlにて2つのファイル比較
-
テキストデータから指定した1...
-
エクセルVBA コードが同じでも...
-
JavaでCSVファイルを高速に読む...
-
perlで、後ろの行を読んで、前...
-
awkスクリプトでダブルクォーテ...
-
window.open でのファイル指定方法
-
Perlで特定行から特定行までを...
-
batファイルでrenameができませ...
-
FindFirstFileとFindNextFileで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ReadLineでの読み出し行を指定する
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
エクセルVBA コードが同じでも...
-
Perlの変数に文字数制限(容量...
-
perlで、後ろの行を読んで、前...
-
C言語でのファイルのデータ更...
-
2つのCSVファイルをマッチング
-
VB6.0でDB接続する際に切断時の...
-
CSVが可変長の場合の検索方法
-
perlで容量の大きいCSVファイル...
-
1ファイルずつ読み込みたい
-
VBScriptでファイル保存先のデ...
-
perl で googleAPIを呼び出す...
-
C#でCSVファイルを逐一更新したい
おすすめ情報