お世話になります。
perlを使用して、
下記の元ファイル[infile.txt]よりstart~endの範囲を各テキストファイルに
分割出力する方法をご教授いただけないでしょうか。
※出力ファイル名は元のファイル名 (infile) + 1行目の文字列(単語)にします。
例>>infile_1111.txt , infile_333.txt
よろしくお願いいたします。
[infile.txt]
aaaa
bbbb
start
1111
2222
end
dddd
eeee
start
3333
4444
end
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
エラーの理由を感違いしていました。
以下、訂正します。(1)
start
end
(2)
start
1111end
start2222
end
実際の処理対象に上記 (1) のような中身のないブロックがある、(2) のような中身の行に start または end 含まれている、ということが考えられます。
(1) の場合は書き出す行がないので無視し、(2) の場合は正常に処理されるようにプログラムを修正してみました。
use strict;
my @content;
while (<DATA>) {
if (/^start$/ .. /^end$/) {
chomp;
push @content, $_ if !/^start$/ and !/^end$/;
if (/^end$/ and @content) {
print "infile_$content[0].txt\n", join("\n", @content), "\n\n";
# open OUT, ">infile_$content[0].txt" or die "Can't open: $!";
# print OUT join("\n", @content), "\n";
# close OUT;
@content = ();
}
}
}
__DATA__
aaaa
start
end
bbbb
start
1111end
start2222
end
dddd
eeee
start
3333
4444
end
No.2
- 回答日時:
プログラムの冒頭を次のように変更すると、エラーが解消すると思います。
use strict;
my @content;
while (<DATA> {
.....
No.1
- 回答日時:
スカラーコンテキストの範囲演算子を使うのが、一番簡単かと思います。
次のプログラムでは、ファイル名も中身も画面に表示するようになっています。コメントアウトしてある3行を生かすと、ファイルにも書き出すようになります。while (<DATA>) {
if (/start/ .. /end/) {
chomp;
push @content, $_ if !/start/ and !/end/;
if (/end/) {
print "infile_$content[0].txt\n", join("\n", @content), "\n\n";
# open OUT, ">infile_$content[0].txt" or die "Can't open: $!";
# print OUT join("\n", @content), "\n";
# close OUT;
@content = ();
}
}
}
__DATA__
aaaa
bbbb
start
1111
2222
end
dddd
eeee
start
3333
4444
end
この回答への補足
ご回答ありがとうございます。
初心者で(/start/ .. /end/)の使い方がわからず悩んでました。
line9/10で下記のエラーが出てきたのですが、$contentの初期化をしても解消できませんでした。
Use of uninitialized value $content[0] in concatenation (.) or string at split.pl....
すみませんがよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- その他(プログラミング・Web制作) ファイル名の一部をbatで変更したい batファイルを使って、以下のようにファイル名の一部を変更した 3 2023/02/21 20:09
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルの一部を別のファイル...
-
Perl エラーログを指定の場所...
-
「パスが見つかりません」とい...
-
どなたか教えて下さい。
-
window.open でのファイル指定方法
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
-
エクセルVBAで素数だけを出力す...
-
fgets で値が取得できない
-
エクセルVBA コードが同じでも...
-
配列の中に重複文字列があるか...
-
DOSコマンドで、標準出力を出力...
-
MATLABのm-fileについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
Pythonでegrep機能をつかいたい
-
Fortranで1行飛ばして読み込む方法
-
テキストファイルの各行を配列...
-
C++でのテキストファイル読み込...
-
C言語初心者です。プログラミン...
-
ファイルの内容をスカラー変数...
-
shellのコマンド deffの差分の...
-
<>で区切られたdatファイルをエ...
-
ifstream/ofstream について
-
perlの引数で複数のファイル処...
-
Pythonでテキストを行数指定し...
-
Perl エラーログを指定の場所...
-
perlでCSVをソートする方法につ...
-
「パスが見つかりません」とい...
-
ファイル名に日付を入れてアッ...
-
文字列操作に関する質問です。
-
連番のファイルを何個も開きたい
-
perlでIEのクッキーを削除したい
-
MATLABでカーブフィットしたデ...
おすすめ情報