perlでファイルを分割してファイル名も出力したい

このQ&Aのポイント
  • 大きいサイズのテキストファイルをファイル名ごとに分割して出力する方法を教えてください。
  • 現在のプログラムではファイル名は正しく出力されますが、テキスト内の出力が思ったように行われていません。
  • ご教示いただけると幸いです。
回答を見る
  • ベストアンサー

perlでファイルを分割してファイル名も出力したい

>AA A AAA aaaaaaaaaaaaaaa aaaaaaaaaaaa >BBB BB B bbbbbbbbbbbbbbb bbbbbbbbbbbbbbb bbbbbbbbbbbbbb ・ ・ こういった形式でテキストが入った大きいサイズのひとつのファイルを ・ファイル名 AA A AAA ・テキスト内 >AA A AAA aaaaaaaaaaaaaaa aaaaaaaaaaaa ・ファイル名 BBB BB B ・テキスト内 >BBB BB B bbbbbbbbbbbbbbb bbbbbbbbbbbbbbb bbbbbbbbbbbbbb となるように個別に出力させたいのですがどのようにすればよいでしょうか? #!/usr/bin/perl -w use strict; my $first; my $file; $first = 1; open(IN,"分割前ファイル"); foreach(<IN>) { if ( /^>(.*)/ ) { if ($first == 0 ) { close(OUT); } else {$first = 0; } $file = $1; $file =~ s/[\r\n]//; open(OUT,">$file"); } else { print OUT $1; print OUT $_; } } close(IN); このようなプログラムを組んだのですが、出力結果はファイル名についてはいいのですが、テキスト内が思ったようにいきません。 ・ファイル名 AA A AAA ・テキスト内 AA A AAAaaaaaaaaaaaaaaa AA A AAAaaaaaaaaaaaa このような結果になってしまいます。 どなたか対処方をわかるかたがいましたらお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • TYWalker
  • ベストアンサー率42% (281/661)
回答No.1

ほとんどできてます。がんばってください。 print OUT $1; は最初の一発だけ出せばいいのでopenのあとに移動すればいいでしょう。 そのあとに改行(\n)も忘れずに。

student1998
質問者

お礼

ふたつのprintの後ろにOUTを入れると解決しました。 本当にありがとうございました。

student1998
質問者

補足

ありがとうございます。 print OUT $1; を移動させることで少し目的の形に近づきました。 open(OUT,">$file"); print ">"; print OUT $1; print "\n"; } else { print OUT $_; } } close(IN); としたのですが、出力ファイルが ・ファイル名 AA A AAA ・テキスト内 AA A AAAaaaaaaaaaaaaaaa aaaaaaaaaaaa となり、テキスト内に最初の">"の文字と改行が行われません。 どうすれば改善されるでしょうか?

関連するQ&A

  • Perlでテキストファイル読み込み

    基本的な質問ですみません。 サーバ上のテキストファイルを読み込んで ローカルのテキストファイルに書き込むというだけなのですが 何度やってもできません。 以下プログラムですが #!usr/bin/perl open(IN,"http://*****/***/***.txt"); $file = <IN>; close(IN); open(OUT,"> a.txt"); print(OUT "$file"); close(OUT); サーバのアドレスは、URLうってみて見れたのでhttp://***(以下略)であってると思います。 サーバのテキストにはchmodで777と権限を与えました。 プログラムに問題あるのでしょうか。 この場合考えられる原因を教えてください。

    • ベストアンサー
    • Perl
  • ファイル分割2

    前回ファイル分割について質問させていただいた者です。 ファイル名 あいうえお.txt 内容 <A>AAA <B>BBB <C>CCC <D>DDD <E>EEE <F>FFF というファイルを ファイル名 あいうえお1.csv A,B AAA,BBB ファイル名 あいうえお2.csv C,D CCC,DDD ファイル名 あいうえお3.csv E,F EEE,FFF という感じで変換させたいと思っております。 A,B,C,D,E,F AAA,BBB,CCC,DDD,EEE,FFF に変換するプログラムは my $mae = my $filename = shift @ARGV; my $ato = "$filename.csv"; open(IN,"$mae") || die "Can't open!"; my @datas = <IN>; close (IN); my (@ichi,@ni); foreach (@datas){ if ($_ =~ /^<(.*)>(.*)$/){ push(@ichi,$1); push(@ni,$2); } } my $ichi = join(",",@ichi); my $ni = join(",",@ni); open (IN,">$ato") || die "Can't open!"; eval 'flock(IN,2);'; seek (IN,0,0); print IN ("$ichi\n"); print IN ("$ni\n"); eval 'flock(IN,8);'; close (IN); exit; こんな感じで作成したのですが、前回教えていただいた3つファイルに分割するプログラムをどのように追加するか わかりません。 ほんとにあほみたいなことを聞いているとは思いますが、 教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • ハッシュを使った集計結果の出力について

    ハッシュを使った集計結果の出力について testフォルダに以下のファイルがあるとします。  aaa_1、aaa_2、bbb_1、bbb_2、ccc_1、・・・ 各ファイルには○△×がついた行があり、 「aaa」のファイル(aaa_1とaaa_2)の○△×の数、「bbb」のファイルの○△×の数、を集計したいと思っています。 出力イメージは以下です。  ファイル名の一部,○の数,△の数,×の数  aaa,13,59,37 ファイル名の一部をキーとして、 ○△×の回数を値にしたハッシュで集計しようとしましたが、 以下のようになってしまいました。 ,0,0,0 ,0,0,0,0,0,0 aaa,13,59,0 aaa,13,59,0,13,59,37 bbb,20,10,0 bbb,20,10,0,20,10,30 ハッシュが十分に分かっていないので、おかしなことをしてるのだと思うのですが。。 ご教授くださいますよう、お願いします。 opendir(DIR, $dir); while ($file = readdir(DIR)){  $maru =0;  $san =0;  $batu =0;  $file =~/(.*)_(.*)/;  $name = $1;  open(IN, "$dir/$file");   while ( $line = <FIN1> )   {    chomp( $line );    if($line =~/○/){      $maru++;    }elsif($line =~/△/){      $san++;    }elsif($line =~/×/){      $batu++;    }  } push(@{$test{$name}} , $maru,$san,$batu); @gyou = ( $name , join ("," , @{$test{$name}})) ; print OUT join (",", @gyou). "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • ファイル読み込みマッチングについて

    現在二つのファイルをつき合わせて一致しない ファイルを出力するようなものを作っています。 例ですが。 ---a.txtココカラ--- aaa bbb ccc ---ココマデ--- ---b.txtココカラ--- aaa ccc ddd fff ---ココマデ--- 上記ファイルを照らし合わせて 以下のファイルを出力 ---c.txtココカラ--- bbb ---ココマデ--- のように出力させたいのですが。 自分の作成したものは ---a.plココカラ--- open(IN1,"a.txt") || die $!; open(IN2,"b.txt") || die $!; open(OUT,">c.txt") || die $!; sub hikaku { while(<IN2>){ if($a eq $b){ return; } } print OUT "$a"; return; } while(<IN1>){ $a = $_; &hikaku; } close(IN1); close(IN2); close(OUT); ---ココマデ--- いろいろテストをしてわかったことですが サブルーチンの while(<IN2>) そのままに なる一回しか回らないことがわかりました。 これは偽になった後、サブルーチンを抜けまた 回ってきた時に偽と判断されるからでしょうか? プログミング自体始めたばかりなので、こんなん あかんに決まってるやん!とか一からだなこれ!! とか導いていただけるなら厳しいご指摘お待ちして おります。 長くなりましたがよろしくお願い致します!!

    • ベストアンサー
    • Perl
  • Perlでファイル出力時にデッドロック(?)してしまいます。

    Perl(5.005_03)で、約5000万バイトのテキストファイルを読み込んで、そのデータに変更を加えた後、別のテキストファイルに書き出すプログラムを作っています。 テキストファイルへの書き出しは、16回に分けて約300万バイトずつ行っています。 すると、ファイルへの書き出しが半分も終わらないうちに、デッドロック(?)してしまうみたいで、書き出し中のファイルは途中のまんま、プログラムが終わってしまいます。。。 いまは、出力ファイルを開く前に「print " ";」を入れることでとりあえず動いています。(それも、どうしてなのかわかりません・・・) 何か良い方法はないでしょうか? よろしくお願いします。 【環境】sun4-solaris, apache 以下は、ファイルへ書き出している部分のソースです ------------------------------------------------------------------- print " "; # これを入れないとプログラムが正常終了できません open OUT, ">>$file" || die "can't open : $!"; print OUT $data; # $data には約300万バイト入っています close OUT; -------------------------------------------------------------------

    • ベストアンサー
    • Perl
  • エクセルで2つのファイルを差分して、追加・削除されたそれぞれのファイルのデータセルを色で塗る。

    エクセルで2つのファイルを差分して、追加・削除されたそれぞれのファイルのデータセルを色で塗る。変更のないものは元ファイルから新ファイルへセル内容をコピーするというVBAは可能でしょうか? 例)元ファイル、新ファイルにおいてA列を差分。 元ファイル 新ファイル   A   B    A   B 1 aa1  bb1   aa1 2 aa2  bb2   aa3 3 aa3  bb3   aaA 4 aa4  bb4   aa4 とあるとします。 追加>新ファイルのA3セルを塗る。 削除>元ファイルのA2セルを塗る。 変更なし>新ファイルのB1、B2、B4へ元ファイルのB1、B3、B4のデータをコピペ。 元ファイル 新ファイル   A   B    A   B 1 aa1  bb1   aa1  bb1 2 aa2  bb2   aa3  bb3 3 aa3  bb3   aaA 4 aa4  bb4   aa4  bb4 このような感じです。 どうぞよろしくお願いします。

  • 文字変換で,を改行されないようにしたい

    下記のスクリプトでファイルから読み込んだ行毎の文字列<>を'=>'に変換後、行の先頭に'を付け足し行の最後に',を付け加えた場合、変な風に改行されてしまいます。 $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { ($a, $b) = split(/<>/, $_); print OUT "'$a'=>'$b',"; } close(OUT); 実行結果 $ cat date.txt '01'=>'ああああ ','01_01'=>'あAAA ','01_02'=>'あBBB ','01_03'=>'あCCC ','01_04'=>'あDDD ','02'=>'いいいい ','02_01'=>'いAAA ','02_02'=>'いBBB ','02_03'=>'いCCC ','02_04'=>'いDDD ', これを下記のように整形するにはスクリプトのどこを直せばよいのでしょうか。 '01'=>'ああああ', '01_01'=>'あAAA', '01_02'=>'あBBB', '01_03'=>'あCCC', '01_04'=>'あDDD', '02'=>'いいいい', '02_01'=>'いAAA', '02_02'=>'いBBB', '02_03'=>'いCCC', '02_04'=>'いDDD', どなたかご教授お願い致します。(上記のスクリプト以外の方法で スマートなやり方などありましたらあわせてご教授頂けますと助かります。)

    • ベストアンサー
    • Perl
  • ファイルに出力する際、上書きしない(Java)

    Javaで、例えばテキストファイルに「aaa」と出力する際、 try { PrintWriter fout = new PrintWriter(new BufferedWriter( new FileWriter("tst1.txt"))); fout.println("aaa"); fout.close(); } としているのですが、このプログラムを一度実行したあと「aaa」の部分を「bbb」と書き直して再度実行した場合、 tst1.txtには、「bbb」と記されています。 つまり、上書きされたということだと思うのですが、 上書きではなくて、「aaa」の後に続けて「bbb」と表記する方法を教えていただきたいです。 うまく説明できていないと思いますが、わかりにくい点は指摘していただければ補足しますので、よろしくお願いします。

    • ベストアンサー
    • Java
  • 画像ファイルの別名保存(CGI)

    サーバーに既にある画像ファイル(test.gif)を別名に変えて保存するCGIを作ろうとしています(ただのリネームではなく、結果的に元の画像ファイルと名前を変更した画像ファイルの2つがサーバーに残るようにしたいです)。 ファイルハンドルによる関連付けで、test.gifを一度@aaa配列として読み込み、その@aaa配列を使って「bbb.gif」に書き出すという文を書いて見ましたが、生成されるファイルは画像ファイルとして表示してくれずにエラーとなってしまいます。 どなたか解決方法がわかる方アドバイスをお願いしますm(_ _)m 以下ソースです。 --------- open (IN,"test.gif"); @aaa = <IN>; close (IN); open (OUT,"> bbb.gif"); print OUT @aaa; close (OUT); ------ ↑はgifファイルではなくtxtファイルだと上手く行きます。 参考にしたサイトは↓です。 http://www.aimix.jp/cgi/syohofileread.html http://www.aimix.jp/cgi/syohofilewrite.html よろしくお願いしますm(_ _)m

    • 締切済み
    • CGI
  • 【少し急いでます】エクセルについて教えてください!

    Excel2000を使っています。 A列に重複するデータがあり、B列に別データがあります(20000行強) 例)     A  B 1  001 aaa 2   001 bbb 3   001 ccc 4   002 aa 5  002 bb 6  003 aaa 7  003 bbb 8  004 ddd 9   004 eee 10  005 aa 11  006 bbb A列で重複する001は3行あり、重複しているデータは1行にまとめてB列のaaa、bbb、cccをつなげたいです。(わかりづらくてすみません) 例)     A      B 1  001  aaa・bbb・ccc 2  002   aa・bb 3  003  aaa・bbb というようにまとめたいです。 どのような方法がありますでしょうか? よろしくお願い致します。

専門家に質問してみよう