新しく質問する

perlでファイルを分割するプログラム

役に立った:1件
  • 質問者:arumisoy
  • 投稿日時:2004/03/10 10:00
  • 困り度:暇なときに回答をください

3Mを超える1つのテキストファイルに入っているデータある目印をもとに分割したいと思っています。分割ソフトをさがしたのですが見つけられませんでした(サイズで分割はありました)perlでテキスト処理ができると思い「テキスト処理とCGIのためのPerlプログラミング 伊藤 博康 (著) 」という本を借りてきたのですが、そのようなサンプルがなく1からperlを勉強する時間もないため、ここで質問させていただきました。ネット上にファイルを分割するperlのサンプルプログラムがありましたら教えてください。よろしくお願いします。

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:1件)
  • 参考になった:0件
  • 回答者:sisya
  • 回答日時:2004/03/10 15:54

すいません確かに「:」は「;」にしないとエラーです。
実行できる環境がないのであいまいなソースになっちゃってますね(^^;

ファイル2以降に保存できていないのは、
たぶん
>if(/^〓(.+)$/){
の所を
>if(/^〓(.+)/){
とすれば問題無いかと思います。

通報する

この回答へのお礼

ありがとうございました
実行してみます
皆さんに教えていただいた3通りのプログラムを
くらべてファイルの読み込みと書き出しが
理解できるようにしたいと思っています

  • 参考になった:0件
  • 回答者:sisya
  • 回答日時:2004/03/10 13:18

既に修正版の回答がでてますね(^^;
一応書いて見たので張るだけはっておきます

$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をだすにはどのようにしたら
いいでしょうか
よろしくお願いします

  • 参考になった:1件
  • 回答者:leaz024
  • 回答日時:2004/03/10 13:15

試しに作ってみました。
※スクリプト内の全角スペースは、タブなどに置き換えてください。

# ---- ここから ----
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人だけしかポイントをつけられないため
早い順にさせていただこうと思っています
お礼の気持ちは同じです
どうもありがとうございました

  • 参考になった:0件

 大ボケかましました(^_^;

$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);

 こっちが正解です。

通報する

この回答へのお礼

ありがとうございました

実行できました

  • 参考になった:0件

 これでどうでしょう?

$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で中身がみあたらないようですがどこをなおせばいいでしょうか
よろしくお願いします

  • 参考になった:0件

No.2ベストアンサー10pt

  • 回答者:sisya
  • 回答日時:2004/03/10 11:06

「ある目印」がどういうものなのかが判らないと紹介の仕様がないです。

また、perlの知識が全く無い状態と見受けましたが、
windows上でperlを動作させて文書の分割をなさる場合、
perlをインストールした後
「コマンドプロンプトでスクリプトを実行させる」
「httpdをインストールしてブラウザ上で実行させる」
「perlが動作するサーバにすべてアップロードして、ネットワーク越しに実行する」
と言ういずれかの方法を行う必要があります。

単純にテキストエディタで置換を行ったほうが早いのではないかと思います。

※分割条件が単純なら即興で作ってもかまいませんが…

通報する

この回答へのお礼

ありがとうございます
「コマンドプロンプトでスクリプトを実行させる」
で行ってみようと思っています
ほかの2つの方法があることは知りませんでした

  • 参考になった:0件

No.1ベストアンサー20pt

 存在しません(^_^;
 簡単に「ある目印」と書かれていますが、その目印はプログラマーの数だけ種類があり、その目印の形によってはプログラム構造自体の変更が必要です。
 読者が欲しい目印の形を先読みしてプログラムを組むのは不可能です。

 どんな目印でしょうか?
 簡単な目印なら、ここにサンプルプログラムを書けるかもしれません。

通報する

この回答への補足

たとえば目印「〓」が行の先頭にあり
〓file1.txt
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
............
〓file2.txt
zzzzzzzzz
zzzzzzzzz
というデータを
file1.txtという名前で中身は
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
file2.txtという名前で中身は
zzzzzzzzz
zzzzzzzzz
に分けたいのです
よろしくお願いします

  
このQ&Aは役に立ちましたか?(役に立った:1件)

このページのトップへ