Perlで質問タイトルのとおり、同じフォルダに有るテキストファイルをすべて正規表現を用いて改変し、末尾に_2(この部分は別名になればいいのでどうでもいいと思います)というファイル名をつけて別名で保存する方法を教えてください。Perlはストロベリーのコマンドラインから使ってます。
https://mjin.doshisha.ac.jp/R/57/57.html
確かにこのようにバッチファイルを作っても、実際のところ、バッチファイル内に特定の文字列をしっかりと元のテキストデータに指定せねばならないので、結局手間がかかります。もっと簡単にできる方法がないかと今日一日潰して考えましたが、できませんでした。
正規表現でテキストの中身を改変することは出来ましたが、ふつーにファイル名のところを正規表現にすれば実現できるのでは?と考えましたが、なかなかうまくいきません。コード事例があるとかなり嬉しいのですが...。
No.3ベストアンサー
- 回答日時:
以下のスクリプトを実行してください
第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;
}
No.5
- 回答日時:
>file.txt と file_2.txt があるディレクトリ
>ではどうすればいいんでしょうか?
その時は、プログラムが誤操作するだけです。
そもそも、そのようなディレクトリを作るような運用をしてはいけません。
No.4
- 回答日時:
例えば「末尾に _2 を付ける」ということだと
file.txt と file_2.txt があるディレクトリ
ではどうすればいいんでしょうか?
あと本題ではないけど
・$_ =~s/([^\x01-\x7E])\s+/\1\2/g; ってなにをしたいの?
・open のファイルハンドルには変数を使うのが現代的かなぁ
という指摘 and/or 突っ込みもしておこう.
No.2
- 回答日時:
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つのサブルーチンとして)組み込み可能なのでしょうか。
上記のような前提であれば、スクリプトの提供は可能です。
その場合、あなたが作成した処理の具体的な呼び出し方を提示ください。
ご返信有難うございます。
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
というように作って実行はしましたが、技術が全然ダメダメなので失敗して試行錯誤したうえでまだこの手法のほうがましだったというような状況です。
未熟者で恐縮ですが、お返事いただければと思います。説明が拙くて、すみません...。
No.1
- 回答日時:
①正規表現でテキストの中身を改変することは出来ましたが、
②ふつーにファイル名のところを正規表現にすれば実現できるのでは?と考えましたが、なかなかうまくいきません。
③コード事例があるとかなり嬉しいのですが...。
②の意味がよくわかりません。具体的に例を挙げて説明していただけませんでしょうか。
①でテキストの中身の改変は出来ているが、もっと簡単に②の方法をつかって行いたいということですか?
テキストの改変のルールは全てのファイルに対して同じルールを適用すると考えて良いのですか、それともファイル毎に改変のルールがことなるということですか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/16 14:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) Excelのマクロについて教えてください。 作業フォルダ内に2つのファイルがあります。 このファイル 2 2023/07/09 13:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
psqlでエラーログをとりたい
-
拡張子を元に戻す
-
バッチファイル 複数ファイル...
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
VBSでフォルダ内のテキストファ...
-
★★★PowerShellのpatternについ...
-
テキストの保存
-
VBAでエクセルをtxtに変換する...
-
C言語、ファイルの存在チェック...
-
.txtではなく.logの方が良いの...
-
テキストファイルで提出とは?
-
バッチファイルからVBAに引数を...
-
【エクセルVBA】エクセルからテ...
-
テキストファイルの結合+改行に...
-
テキストファイルのファイル名...
-
バッチファイルで文字列削除に...
-
コマンドプロンプトでスペース...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
バッチファイルで文字列削除に...
-
Windowsのバッチファイルを利用...
-
テキストファイルのファイル名...
-
ファイルの最後に文字列挿入
-
psqlでエラーログをとりたい
-
forfilesで検索したファイルを...
-
バッチファイルからVBAに引数を...
-
accessでSQL文を使ってcsvファ...
-
テキストファイルのタブをカン...
-
MATLABで行列を配列に格納する方法
-
renameコマンドについて
-
【Excel】 VBAを使って毎回名前...
おすすめ情報
説明不足ですみません。フォルダにnewtype.txtとoldtype.txtというテキストファイルがあるとします。正規表現を使ってこのふたつのテキストファイルの”中身”を改変することは実現できました(実際にテキストファイルの中身をいじくっていくデータのクレンジングの部分)。その後バッチファイルを作ってこれら(や同じフォルダにあるさらなる他のテキストファイル)を一括してクレンジング処理した上で、別名で保存することが目標です。このうち後者の部分ができてません。現状バッチファイルを作っても、実際にnewtype.txtだとかoldtype.txtと打ち込むことで元のテキストデータの指定をしているので、結局の所わざわざコマンドラインからPerlを起動してファイル名を打ち込んで...というかんじのありさまです。いわばオートメーション化をしたいということです。ワンライナーは使いたくないのです。
newtype.txtとoldtype.txtのクレンジング手法(中身を正規表現を使って改変整理すること)においては同じ方法で構いません。その後一括してファイル名が区別の付く形にして別名保存できる手間、それをバッチファイルなりなんなりで解決したい...ということです。ご説明が複雑になってしまい申し訳ありませんでした。
すみません、お礼のところではnac.txt>nac2.txtになってますが、補足させていただきましたところでは、事例を上げたまででしてもちろんnewtype.txtだろうがoldtype.txtだろうがおっしゃっていただいたとおりの第二パラメータと仮定して頂いて構いません。例をあげたほうが良いと思ったのですが、矛盾が有り申し訳ないです。もちろん複数のファイルを_2を追加するように、処理できればと考えます。