![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
3Mを超える1つのテキストファイルに入っているデータある目印をもとに分割したいと思っています。分割ソフトをさがしたのですが見つけられませんでした(サイズで分割はありました)perlでテキスト処理ができると思い「テキスト処理とCGIのためのPerlプログラミング 伊藤 博康 (著) 」という本を借りてきたのですが、そのようなサンプルがなく1からperlを勉強する時間もないため、ここで質問させていただきました。ネット上にファイルを分割するperlのサンプルプログラムがありましたら教えてください。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
存在しません(^_^;
簡単に「ある目印」と書かれていますが、その目印はプログラマーの数だけ種類があり、その目印の形によってはプログラム構造自体の変更が必要です。
読者が欲しい目印の形を先読みしてプログラムを組むのは不可能です。
どんな目印でしょうか?
簡単な目印なら、ここにサンプルプログラムを書けるかもしれません。
この回答への補足
たとえば目印「〓」が行の先頭にあり
〓file1.txt
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
............
〓file2.txt
zzzzzzzzz
zzzzzzzzz
というデータを
file1.txtという名前で中身は
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
file2.txtという名前で中身は
zzzzzzzzz
zzzzzzzzz
に分けたいのです
よろしくお願いします
No.6
- 回答日時:
既に修正版の回答がでてますね(^^;
一応書いて見たので張るだけはっておきます
$InputFile = ""; # 3Mを越えるテキスト
open(FILE, $InputFile);
@vFile = <FILE>;
close(FILE);
@vData = ();
$FileName = "";
foreach(@vFile){
if(/^〓(.+)$/){
if((@vData > 0) and ($FileName ne "")){
open(OUT, ">$FileName");
print OUT @vData;
close(OUT);
@vData = ():
}
$FileName = $1;
}
else{
push @vData, $_;
}
}
この回答への補足
ありがとうございます
最初の行
$InputFile = "";
の""の間にインプットするファイル名をいれ
下から8行目の最後の文字:を;に変えて
(こうしないとエラーになったため)
実行したところfile1.txtができました
file2.txtをだすにはどのようにしたら
いいでしょうか
よろしくお願いします
No.5
- 回答日時:
試しに作ってみました。
※スクリプト内の全角スペースは、タブなどに置き換えてください。
# ---- ここから ----
unless ($file = shift) {
print "分割するファイル名を入力してください。\n";
chomp($file = <>);
length $file or exit;
}
open IN, $file or die $!;
while (<IN>) {
if (/^〓(.+)/) {
open OUT, "> $1" or die $!;
print "$1\n";
}
else { print OUT }
}
close IN;
print "complete.\n";
# ---- ここまで ----
コマンドラインから、
perl スクリプト名
または
perl スクリプト名 分割するファイル名
とすれば動きます。
ちょっとだけ技術的なことを。
No.3 さんのスクリプトでは、ファイルの読み込みを foreach で行っていますが、これだと最初にファイルを全部読み込んでから処理を始めるため、あまり大きなファイルを処理するのには向きません。
while だと1行ずつ読み込むのでメモリ効率は良いのですが、その分余計に時間がかかったりします。
実行できました
いろいろな書きかたがあるのですね
少しずつわかっていければと思います
2人だけしかポイントをつけられないため
早い順にさせていただこうと思っています
お礼の気持ちは同じです
どうもありがとうございました
No.4
- 回答日時:
大ボケかましました(^_^;
$first = 1;
open(IN,"<wwwwww");
foreach(<IN>) {
if ( /^〓(.*)/ ) {
if ( $first == 0 ) { close(OUT); }
else { $first = 0; }
$file = $1;
$file =~ s/[\r\n]//;
open(OUT,">$file");
} else {
print OUT $_;
}
}
close(IN);
こっちが正解です。
No.3
- 回答日時:
これでどうでしょう?
$first = 1;
open(IN,"<wwwwww");
foreach(<IN>) {
if ( /^〓(.*)/ ) {
if ( $first == 0 ) { close(OUT); }
else { $first = 0; }
$file = $1;
$file =~ s/[\r\n]//;
open(OUT,">$file");
} else {
print $_;
}
}
close(IN);
上記プログラムの wwwwww の部分に、3Mのファイルの名前を記載します。
この回答への補足
ありがとうございます
実行しましたところfile1.txtとfile2.txtはできたのですがサイズが0で中身がみあたらないようですがどこをなおせばいいでしょうか
よろしくお願いします
No.2
- 回答日時:
「ある目印」がどういうものなのかが判らないと紹介の仕様がないです。
また、perlの知識が全く無い状態と見受けましたが、
windows上でperlを動作させて文書の分割をなさる場合、
perlをインストールした後
「コマンドプロンプトでスクリプトを実行させる」
「httpdをインストールしてブラウザ上で実行させる」
「perlが動作するサーバにすべてアップロードして、ネットワーク越しに実行する」
と言ういずれかの方法を行う必要があります。
単純にテキストエディタで置換を行ったほうが早いのではないかと思います。
※分割条件が単純なら即興で作ってもかまいませんが…
ありがとうございます
「コマンドプロンプトでスクリプトを実行させる」
で行ってみようと思っています
ほかの2つの方法があることは知りませんでした
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
テキストファイルで提出とは?
-
Messengerを読んで貰うには
-
Wallpaper Engineでおすすめの...
-
このファイルを開く方法で困っ...
-
openした後、closeしないでプロ...
-
Perlで、「が」を、「...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
画像が表示でnull; this.src
-
Perlで時間の計算
-
アルファベットに付いて質問し...
-
Perlの質問:行と列を入れ替え...
-
Perlで、「が」を、「...
-
このファイルを開く方法で困っ...
-
Perlで特定文字列から特定文字...
-
Strawberry Perl for Windows ...
-
Perlで同じフォルダにある任意...
-
Perl の外部モジュールの利用方法
-
perlのrequireの動き方について...
-
PerlでUTF-8のファイルの文字列...
-
ファイルアイコンの左下に緑の□...
おすすめ情報