ファイルの入出力と改行

このQ&Aのポイント
  • ファイルの入出力と改行について教えてください
  • 縦100文字横70文字のデータが入ったデータファイルを横50文字にして並べ直したい
  • 標準出力での試みがうまくいかないので、解決策を教えてください
回答を見る
  • ベストアンサー

ファイルの入出力と改行

縦100文字横70文字のデータが入ったデータファイルを横50文字にして並べ直したいと思い、まず試しに標準出力でそれがうまくいくかやってみたのですが、うまくいきません。もしお分かりであれば教えていください。よろしくお願いいたします。 #! /usr/bin/perl $filename = "reference.txt"; open HANDLE, "<$filename" or die "cannot open :$!"; print "open success\n"; @array = <HANDLE>; $count = 1; foreach $var (@array) { chomp $var; # print $var; if($count==50){ print $var, "\n"; } else{ print $var; } $count++; } close HANDLE; print "\n";

  • Perl
  • 回答数3
  • ありがとう数75

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

  • ベストアンサー
  • __awa__
  • ベストアンサー率100% (5/5)
回答No.3

こんな感じで文字列を変数に保存しておいて,ファイルの中身を削除してからもう一度書き込むとか.もしくは,別のファイルを書き込みモードで開いて読み込みながら書き込んで,完了したら元のファイルを削除して,新しく作ったファイルを元のファイルの名前でリネームしてもいいかも. my $filename = "reference.txt"; open FILE, "+< $filename" or die "$!"; my $tmp; # 保存したい文字列を入れておく変数 my $count = 0; while(my $c = getc FILE){ # 1文字ずつ読み込む next if($c eq "\n"); # 改行は飛ばす $tmp .= $c; # $tmpに1文字ずつ連結 $count++; # カウントアップ $tmp .= "\n" unless($count % 50); # 50文字連結したら改行 } truncate FILE, 0; # ファイルの中身を全削除 seek FILE, 0, 0; # ファイルの先頭に移動 print FILE $tmp; # $tmpの内容を書き込む close FILE;

ken6791
質問者

お礼

早速の回答ありがとうございました。perl初心者なものでかなりてんぱってました。助かりました。

その他の回答 (2)

  • __awa__
  • ベストアンサー率100% (5/5)
回答No.2

こんな感じですかね.&nbsp; my $filename = "reference.txt"; open FILE, $filename or die "$!"; my $count = 0; while(my $c = getc FILE){ # 1文字ずつ読み込む next if($c eq "\n"); # 改行は飛ばす print $c; # 出力 $count++; # カウントアップ print "\n" unless($count % 50); # 50文字出力したら改行 } close FILE; print "\n";

ken6791
質問者

補足

早速のお返事ありがとうございました。とてもわかりやすいプログラムをありがとうございました。確認しました。 横50文字に整理した形を標準出力しようとしましたが、これを標準出力せず、その結果をもとのファイル、reference.txtにそのまま上書きしたいのですが、 open文を open FILE, "+<$filename" or die "$!"; とし、 print文を print FILE $c; print FILE "\n" unless($count % 50); としたのですが、うまくいきません。 open文を上書きのためにもう一つ作ったりもしましたが、うまくいきませんでした。 やはり同じファイルを使ってすべてを上書きすることはできないのでしょうか?

  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

@array = <HANDLE>; これは,HANDLEのファイルの中身を行単位で配列にします. ですので,$varに入るのは1行分の文字列であって,1文字ではありません.

ken6791
質問者

補足

早速の回答ありがとうございます。 $varに入るのは1行分の文字列ということで、その場合、どのようにすれば50文字で改行を入れることができるでしょうか? 具体的に教えてください。

関連するQ&A

  • データファイル中のデータをランダムに整列させる方法

    横70文字縦100文字のデータを横X文字のデータを縦にY行整列させ、その結果をもとのファイルに上書きするプログラムを作成しようとしています。横X文字のデータは最初のデータのどこをとってもよく、他の行の一部とかぶってもいいです。X、Yはランダムです。横にX文字ファイルに上書きしたら、またランダムなX文字を次の行に上書きします。かなり考えましたが、作成したプログラムがうまくいきません。どなたか教えてください。よろしくお願いします。 #! /usr/bin/perl my $filename = "reference.fasta"; open FILE, "+< $filename" or die "$!"; my $tmp; my $count = 0; while(my $c = getc FILE){ next if($c eq "\n"); $array[$count] = $c; $count++; } for($j=0;$j<50;$j++){ $var = int(rand 50); for($i=0;$i<$var;$i++){ # print FILE $array[$j][$i]; $tmp .= $array[$j][$i]; } print FILE $tmp, "\n"; } close FILE;

    • ベストアンサー
    • Perl
  • ファイルの入出力2

    指定したフォルダ内にあるcsvファイルのデータを 指定したhtmlファイルに出力するプログラムを書いているのですが、 下記のままだとcsvファイルにあるすべてのデータをとってきてしまいます。実現させたいことは「指定したフォルダ内にあるcsvファイル2行目のデータだけファイル出力する」というものです。 どなたかご協力お願いします。 #!/usr/bin/perl #--------------------------------------------------------------# # ディレクトリを開く #--------------------------------------------------------------# opendir(DIR,"test/"); #--------------------------------------------------------------# # 出力ファイル名を指定 #--------------------------------------------------------------# $dest = "test.html"; open (OUT, ">$dest") or die "$!"; #--------------------------------------------------------------# # 出力ファイルにhtmlを出力 #--------------------------------------------------------------# print OUT '<html> <head> <title>無題ドキュメント</title> <style type="text/css"> <!--.style1 {color: #FFFFFF}--> </style> </head> <body> <table width="419" height="105" border="0" cellpadding="0" cellspacing="0"> <tr> <th bgcolor="#000000"><span class="style1">名前</span></th> <th bgcolor="#000000"><span class="style1">住所</span></th> <th bgcolor="#000000"><span class="style1">性別</span></th> </tr>'; #--------------------------------------------------------------# # ディレクトリにあるファイル名を取得 #--------------------------------------------------------------# while ($filename = readdir(DIR)) { # ディレクトリにあるファイルパスを取得 $path = "test/$filename"; if(-f $path) { # ファイルオープン open (IN, $path) or die "$!"; while (<IN>) { # カンマ区切りでデータを取得&改行削除 chomp(@data = split(/,/, $_)); print OUT "<tr>\n"; # 各行の3つのカンマ区切りデータを取得 print OUT "<th bgcolor=\"#666666\">",$data[0],"</th>\n<td>",$data[1],"</td>\n<td>",$data[2],"</td>\n"; print OUT "</tr>\n"; } close(IN); } } #--------------------------------------------------------------# # ディレクトリを閉じる #--------------------------------------------------------------# closedir(DIR); print OUT "</table> </body> </html>"; #--------------------------------------------------------------# # ファイルを閉じる #--------------------------------------------------------------# close(OUT);

    • ベストアンサー
    • Perl
  • ファイルの入出力

    あるフォルダにはいっているすべてのcsvファイルのデータをひとつのテキストファイルに出力したいのですが、うまくいきません。 わからなかったのでとりあえず、別々のファイルで下記を 実行してみました。 ■指定のフォルダに入っているファイル名をすべて出力。 これはうまくいきました。csvファイルが3つほど入っているのですが、 3つのファイル名が出力されます。 #!/usr/bin/perl opendir(IN,"test/"); while ($filename = readdir(IN)) { $path = "C:/perl/test/$filename"; $source = $filename; print $source,"\n" if -f $path; } ■指定のファイル(a.csv)の中身をtest.htmlとしてファイル出力 これもうまくいきました。カンマ区切りのデータが、 行ごとにあるだけはいっていき、htmlのテーブルにがつがつはいっていきます。 #!/usr/bin/perl my $source = "a.csv"; open (IN, $source) or die "$!"; my $dest = "test.html"; open (OUT, ">$dest") or die "$!"; print OUT '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <title>無題ドキュメント</title> <style type="text/css"> <!-- .style1 {color: #FFFFFF} --> </style> </head> <body> <table width="419" height="105" border="0" cellpadding="0" cellspacing="0"> <tr> <th bgcolor="#000000"><span class="style1">名前</span></th> <th bgcolor="#000000"><span class="style1">住所</span></th> <th bgcolor="#000000"><span class="style1">性別</span></th> </tr>'; while (<IN>) { chomp; @data = split(/,/, $_); print OUT "<tr>\n"; print OUT "<th bgcolor=\"#666666\">",$data[0],"</th>\n<td>",$data[1],"</td>\n<td>",$data[2],"</td>\n"; print OUT "</tr>\n"; } print OUT "</table> </body> </html>"; つまり、この二つを1ファイルにまとめたいのです。 一個目で取得したファイル名リストを 2個目のopen で順次ファイルの中身を取っていってほしいのです。 いったんファイル名をテキストファイルに出力してから、 それを読む方法もあったのですが、 できたら、ファイルを出力せずに変数からそのまま、 ファイル名の一覧を取得したいと思っています。 どなたか教えていただけますでしょうか。

    • ベストアンサー
    • Perl
  • ログファイルへの書き込みがうまくいきません

    ------------------------------------------ open(LOG,"+<$filename") || die "Error!\n"; @logs=<LOG>; flock(LOG,2); unshift(@logs,"$array[0],$array[1],$array[2],$array[3],$array[4]\n"); print LOG @logs; flock(LOG,8); close(LOG); ------------------------------------------ この$array[0]~$array[4]にはそれぞれ、「<option value="1">1</option>」の様な、プルダウンメニューの「1~10」までの数字が入っています。 この数字を$filenameへ書き込みたいのですが、中々うまくいかずに困っています。 ちなみに、一応書き込めるには書き込めるのですが、$filenameを開くと、 ------------------------ 1,1,1,1,1 6,4,1,9,6 1,1,1,1,1 9,1,2,4,4 1,1,1,1,1 3,0,1,9,5 1,1,1,1,1 ------------------------ このような形になってしまいます。何がいけないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルの入出力

    Perl初心者です。基礎の基礎なので自分なりに調べたり勉強したりしたのですがいまひとつ理解できないので教えて下さい>< ファイルの入力のサンプルとして open(FIN,"name.txt"); binmode FIN,'utf8'; $line=<FIN>; chomp($line); print"hello!$line\n"; close(FIN); を何の説明もなく提示されました。 2行目は日本語を入力するためのものだということはわかります。 しかし所々に出てくるFINとは何でしょう?また$lineとは何事でしょう? 質問もしてみたのですが如何せん言ってることがよくわからない教授なもので、万事休すです´` どなたかこのファイルを簡単に説明して下さるとありがたいです。

    • ベストアンサー
    • Perl
  • foreachの実行結果について

    お世話になります。 以下のソースの実行結果が自分のトレースしたのと何故違うのか頭を抱えています。 ご指導よろしくお願いします。 <?php $arr=array(array(100,200),array('aaa','bbb','ccc')); foreach($arr as $foo){ print "*****\n"; foreach($foo as $var){ print $var ."\n"; } } ?> <自分の答え> ***** 100 ***** 200 ***** aaa ***** bbb ***** ccc <正解> ***** 100 200 ***** aaa bbb ccc 正解の回答に納得が行かないのです… foreach文がネストしてて内側のforeachの処理が一回終了してから 外側のforeachにいくものだと自分は思っています。 違うのでしょうか?

    • ベストアンサー
    • PHP
  • CSVファイルの改行

    似たような質問はあったのですが、解決できませんでした。 複数のテーブル(mysql)から抽出したデータをCSVファイルにして ダウンロードという動きを作りましたが、Excelでは改行されているのに メモ帳だと改行されません。 配列の最後に"\r\n"を挿入してみたところ、メモ帳での改行はできたのですが、 Excelに必要ない改行が入ってしまいます。(あたりまえですよね) 改行コードの入れるタイミングと方法を教えて頂けますか。 select文 while($rows = @mysql_fetch_array($result)){ $list[$i] = array ($aaa,$bbb,$ccc); $i++; } $filename = 'ファイル名'; $fp = fopen($filename.'.csv', 'w'); foreach ($list as $line) { fputcsv( $fp , $line ); } fclose($fp); ZIP圧縮処理後ダウンロード 環境:php5,mysql5

    • 締切済み
    • PHP
  • perl 計算結果をファイルへ出力したい

    perl やり始めたばかりです。宜しくお願いします。 入力ファイル data.txt があるとします。 data.txt は、 123 456 789 333 555 777 以上のようなテキストファイルといたします。このファイルを 以下の様に100分の1にして出力したい。 1.23 4.56 7.89 3.33 5.55 7.77 と言うことで、この場で教えていただきました。それが、以下です。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); foreach $line (@x){ chomp($line); @elms = split(' ',$line); foreach $data (@elms){ print $data/100," "; } print "\n"; } おかげ様でこれはこれで上手く動きました。そこで、出力値をファイルに 書き込みたいのです。 もちろん、以下の様な方法でファイルに 書き込めるのは判っております。 計算プログラム.pl > outfile.txt しかし、上のプログラムをベースにファイルに書き込めないかと色々と 試してはみましたが、どうも上手く行きません。 どなたか教えて頂けないでしょうか? 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • ファイルを読み込んで改行だけの行を取り除きたい

    こんばんは。 ファイルを読み込んで、改行だけの行を省いて、上書きしたいのですが なぜかうまくいきません。 ループ内にある改行の判定をするIF文がいけないと思うのですが…。 教えていただけないでしょうか? また、シングルクォーテーションダブルっクォーテーションは同じ意味 なのですか?「""」と「''」 作ったプログラムは以下です。 open(OUT,">$ssifile"); #改行のみのデータは除く @newtbl = (); foreach $siline ( @slines) { if ($slines ne "\n") { push @newtbl, $siline; } } print OUT @newtbl; close(OUT); 宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • perl初心者ですが、プログラム作成で行き詰ってしまいました。

    perl初心者ですが、プログラム作成で行き詰ってしまいました。 参考書を読みあさり、色々とググってみたのですが、どうしても組み立てられません。知識のある方ご回答よろしくお願いします。 一つ目は: 英語の文章を記憶したファイルを指定し,その内容を読み込み,文章内に含まれる単語を出現頻度の降順で表示させるプログラムを作成すること 「1位:・・・(・・回)」 「2位:・・・(・・回)」 ... なお,一つの単語が二行にまたがることはないものとする。 二つ目は: テストの成績データを記憶したCSV ファイルを指定し,その内容を読み込み,各学生の総合点と順位,各科目の最高点,最低点,平均点を記憶したCSVファイルを書き出すプログラムを作成せよ。 なお,入力用のファイルと出力用のファイルはキーボード入力で指定するものとする。 また,異なる学生数および科目数のCSV ファイルを読み込んでも正しく動作するようにすること。 卒業のかかったレポートで、この二つを完成させないと先に進めないのです。 本当に図々しい質問で大変申し訳ありません。知識のある方どうかご教授ねがいます。 *ひとつめに関しては: open (FILE, 'perl.txt') or die "$!"; while (my @array = <FILE>){ foreach (@array) { $count{ $_ }++ ; } @rank = sort { $count{ $b } <=> $count{ $a } } keys %count ; foreach (0..$#rank) { $kagi = $rank[ $_ ]; $kaisu = $count{ $kagi } ; print $_+1, "位:$kagi($kaisu 回)\n" ; } } のように書いたところで行き詰ってしまいました。 二つ目は: open (FILE, 'data.txt') chomp(@data = <FILE>) ; $i= 1 ; # 行番号を記憶する変数 for (@data) { # 各行に対して以下を繰り返す. # 各行の数値を配列の要素として記憶する. @list = split(/,/, $_) ; # サブルーチンを呼び出して,結果を表示 print "$i行目:" ; print "数値:",&cardinality(@list),"個," ; print "最大値:",&maximum(@list),"," ; print "最少値:",&minimum(@list),"," ; print "合計:",&summation(@list),"," ; print "平均:",&average(@list),"\n" ; # 行番号の更新 $i++ ; } とまで書き、もう何が何だか訳わからなくなってしまいました。

    • ベストアンサー
    • Perl

専門家に質問してみよう