• ベストアンサー

オープンしたファイルで行の連結

はじめまして、言語に疎いもので質問させて頂きます。 次のようなsample.txtというファイルがあります。 【sample.txt】 ABC #1行目 <タブ>DEF #2行目 行頭にタブ <タブ>GHI #3行目 行頭にタブ JKL #4行目 <タブ>MNO #5行目 行頭にタブ PQR #6行目 <タブ>STU #7行目 行頭にタブ <タブ>VWX #8行目 行頭にタブ (・・・以下上記のような2、3行のブロックパターンがランダムで続く) 1~3行目を1ブロック、また4~5行目、6~8行目を一部ロックとして 半角スペースを間に挟んで一行に連結し、下のように別ファイルに出力したいと考えております。 【output.txt】 ABC DEF GHI JKL MNO PQR STU VWX ファイル自体は次のようにopen関数で開き、一行ずつ読み込んでいますが、現在の行を読みつつ、 次の行の内容をどうしたら読むことができるかわかりません。 また行の連結はどのように行えばよいでしょうか。 2、3行のブロックパターンがランダムで続くため、次の行の先頭にタブがあれば連結するという 処理も加えたいと考えております。 open(IN, $sample.txt); while (<IN>) {    $line = <IN>; } 質問内容もわかり辛いかと思いますがご教授頂けますでしょうか。

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

  • ベストアンサー
  • benelli
  • ベストアンサー率51% (78/152)
回答No.2

もっとも簡単な解決方法は配列を使用してファイルの中身全部を一気に読み込んでしまう方法です。 open(IN, "sample.txt"); @xx = <IN>; close(IN); print "$xx[0]$xx[1]$xx[2]\n"; print "$xx[3]$xx[4]$xx[5]\n"; print "$xx[6]$xx[7]$xx[8]\n"; 見ただけではよく分からないかもしれませんが、変数や配列の使い方とその応用を重点的に勉強すればよろしいかと思います。 「次の行の先頭にタブがあれば連結するという」というのは例えばこんな感じでしょうか。 $gyoumatome = ""; foreach $yy (@xx) { $checkchar = substr($yy, 0 , 1); if( $checkchar eq "\t") { $gyoumatome = "$gyoumatome$yy"; } else { print "$gyoumaotme\n"; $gyoumaotme = $yy; } } print "$gyoumaotme\n"; コンパイラ等流してのチェックはしていませんが、作成方針としてはこんな感じかと思います。 簡単な命令文だけで作ったつもりなので、これらよりもっと効率的で強力な関数をたくさん覚えて改良を目指してもらえればと思います。

ryo2fu
質問者

お礼

いろいろなやり方がありそうで面白いですよね。 ご丁寧に有難うございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

特に難しいところはないはずだけど.... 何も考えずに書くけど open(IN, "<$sample.txt"); chomp($line = <IN>); while ($l = <IN>) { chomp $l; if ($l =~ /^\t/) { $l =~ s/^\t/ /; $line .= $l; } else { print "$line\n"; $line = $l; } } print "$line\n"; close IN; くらい?

ryo2fu
質問者

お礼

ご回答有難うございます。 じっくり動かしてみたいと思います。

回答No.1

「行の連結」という目的を達成するだけならば、 ファイルの全行を一気に読み込んで、改行 + タブ を 半角スペース に置換する という方法はいかがでしょうか。 「現在の行を読みつつ次の行を読む方法は?」、という質問の答えにはなっていませんが... ; ------------------------------------------------------------------------------ #!/usr/local/bin/perl use strict; use warnings; use Fatal qw(open close); open my $fh, '<', '$sample.txt'; # 全行を一気に読み込む my $text = do { local $/; <$fh> }; close $fh; # 全ての「改行 + タブ」 を 「半角スペース」 に置換 $text =~ s/\x0D?\x0A?\t/ /g; ------------------------------------------------------------------------------

ryo2fu
質問者

お礼

ご回答有難うございます。 大変参考になりました。

専門家に質問してみよう