プロが教える店舗&オフィスのセキュリティ対策術

Perlで質問タイトルのとおり、同じフォルダに有るテキストファイルをすべて正規表現を用いて改変し、末尾に_2(この部分は別名になればいいのでどうでもいいと思います)というファイル名をつけて別名で保存する方法を教えてください。Perlはストロベリーのコマンドラインから使ってます。

https://mjin.doshisha.ac.jp/R/57/57.html

確かにこのようにバッチファイルを作っても、実際のところ、バッチファイル内に特定の文字列をしっかりと元のテキストデータに指定せねばならないので、結局手間がかかります。もっと簡単にできる方法がないかと今日一日潰して考えましたが、できませんでした。

正規表現でテキストの中身を改変することは出来ましたが、ふつーにファイル名のところを正規表現にすれば実現できるのでは?と考えましたが、なかなかうまくいきません。コード事例があるとかなり嬉しいのですが...。

質問者からの補足コメント

  • 説明不足ですみません。フォルダにnewtype.txtとoldtype.txtというテキストファイルがあるとします。正規表現を使ってこのふたつのテキストファイルの”中身”を改変することは実現できました(実際にテキストファイルの中身をいじくっていくデータのクレンジングの部分)。その後バッチファイルを作ってこれら(や同じフォルダにあるさらなる他のテキストファイル)を一括してクレンジング処理した上で、別名で保存することが目標です。このうち後者の部分ができてません。現状バッチファイルを作っても、実際にnewtype.txtだとかoldtype.txtと打ち込むことで元のテキストデータの指定をしているので、結局の所わざわざコマンドラインからPerlを起動してファイル名を打ち込んで...というかんじのありさまです。いわばオートメーション化をしたいということです。ワンライナーは使いたくないのです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/12/30 19:28
  • newtype.txtとoldtype.txtのクレンジング手法(中身を正規表現を使って改変整理すること)においては同じ方法で構いません。その後一括してファイル名が区別の付く形にして別名保存できる手間、それをバッチファイルなりなんなりで解決したい...ということです。ご説明が複雑になってしまい申し訳ありませんでした。

      補足日時:2018/12/30 19:31
  • すみません、お礼のところではnac.txt>nac2.txtになってますが、補足させていただきましたところでは、事例を上げたまででしてもちろんnewtype.txtだろうがoldtype.txtだろうがおっしゃっていただいたとおりの第二パラメータと仮定して頂いて構いません。例をあげたほうが良いと思ったのですが、矛盾が有り申し訳ないです。もちろん複数のファイルを_2を追加するように、処理できればと考えます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/12/30 20:36

A 回答 (5件)

以下のスクリプトを実行してください


第1パラメータはフォルダ名(フルパス)です。
第1パラメータのフォルダ下の拡張子(.txt)のファイルをすべて取得し、
text_cleansingを呼び出します。
text_cleansingの第1パラメータ:変更前のファイル名
text_cleansingの第2パラメータ:変更後のファイル名
となっています。
------------------------------------------
use strict;
my $dir = $ARGV[0];
-d $dir or die "$dir はフォルダではありません";
opendir(DIR,$dir);
my @files = readdir(DIR);
closedir(DIR);

@files = grep(!-d,@files);
@files = grep (/^.*\.txt$/,@files);

foreach my $name (@files) {
my $new_name = substr($name,0,length($name)-4) . "_2.txt";
my $full_name = $dir . "\\" . $name;
my $new_full_name = $dir . "\\" . $new_name;
#printf("%s->%s\n",$full_name,$new_full_name);
&text_cleansing($full_name,$new_full_name);
}
sub text_cleansing
{
my $fname = shift(@_);
my $fname2 = shift(@_);
open A,$fname;
my @data = <A>;
close A;
open B ,">",$fname2;
for(@data){
$_ =~s/([^\x01-\x7E])\s+/\1\2/g;
$_ =~s/\s+([^\x01-\x7E])/\1\2/g;
print B $_;
}
close B;
}
    • good
    • 0
この回答へのお礼

できました。よく理解できるよう努力したいと思います。ありがとうございます。

お礼日時:2018/12/31 11:01

>file.txt と file_2.txt があるディレクトリ


>ではどうすればいいんでしょうか?
その時は、プログラムが誤操作するだけです。
そもそも、そのようなディレクトリを作るような運用をしてはいけません。
    • good
    • 0

例えば「末尾に _2 を付ける」ということだと


file.txt と file_2.txt があるディレクトリ
ではどうすればいいんでしょうか?

あと本題ではないけど
・$_ =~s/([^\x01-\x7E])\s+/\1\2/g; ってなにをしたいの?
・open のファイルハンドルには変数を使うのが現代的かなぁ
という指摘 and/or 突っ込みもしておこう.
    • good
    • 0

1.OSはwindowsでしょうか


2.以下の様なスクリプトを提供すれば良いのでしょうか。
①特定のフォルダ下の全てのテキストファイルを取得する。
②取得した全てのテキストファイルに対して以下の処理を行う。
 あなたが作成した処理を呼び出す。呼び出す処理の第1パラメータは元のファイル名、第2パラメーは変更後のファイル名とする。
 例 特定のフォルダ下にnewtype.txtとoldtype.txtがあれば、
 第1パラメータ:newtype.txt 第2パラメータ:newtype_2.txt
 第1パラメータ:oldtype.txt 第2パラメータ:oldtype_2.txt
 となる。(ファイル名はフルパスで渡します)
 あなたが作成した処理は、第1パラメータのファイルを読み込み、第2パラメータのファイルへ変換結果を出力する。
3.あなたが作成した処理は、
 ①perlで実装でしょうか
 ②バッチファイルで実装でしょうか
 ③それとも2の呼び出し元のスクリプトに(1つのサブルーチンとして)組み込み可能なのでしょうか。

上記のような前提であれば、スクリプトの提供は可能です。
その場合、あなたが作成した処理の具体的な呼び出し方を提示ください。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご返信有難うございます。

1・OSはWindows10です。

2・そのとおりです。
ネット上の情報を参考にして書いていきました。
はじめはwhileループで回してただけでしたが、

open A,'nac.txt';
@data = <A>;
close A;

open B,'>nac2.txt';
for(@data){
$_ =~s/([^\x01-\x7E])\s+/\1\2/g;
$_ =~s/\s+([^\x01-\x7E])/\1\2/g;

print B $_;
}
close B;

このように正規表現をつかって中身を書き換えています。

3・③の手法でバッチファイルを作る手法があると聞き、その方法でやっておりました。

pl2bat text_cleansing.pl

これがバッチファイルをperlから生成するコマンドらしいと聞きますが、これ以前は自前でバッチファイルを組み込んで、

perl text_cleansing.pl nac.txt>nac2.txt

というように作って実行はしましたが、技術が全然ダメダメなので失敗して試行錯誤したうえでまだこの手法のほうがましだったというような状況です。
未熟者で恐縮ですが、お返事いただければと思います。説明が拙くて、すみません...。

お礼日時:2018/12/30 20:31

①正規表現でテキストの中身を改変することは出来ましたが、


②ふつーにファイル名のところを正規表現にすれば実現できるのでは?と考えましたが、なかなかうまくいきません。
③コード事例があるとかなり嬉しいのですが...。

②の意味がよくわかりません。具体的に例を挙げて説明していただけませんでしょうか。
①でテキストの中身の改変は出来ているが、もっと簡単に②の方法をつかって行いたいということですか?
テキストの改変のルールは全てのファイルに対して同じルールを適用すると考えて良いのですか、それともファイル毎に改変のルールがことなるということですか。
この回答への補足あり
    • good
    • 0

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