電子書籍の厳選無料作品が豊富!

はじめまして、言語に疎いもので質問させて頂きます。

次のような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>;

}

質問内容もわかり辛いかと思いますがご教授頂けますでしょうか。

A 回答 (3件)

もっとも簡単な解決方法は配列を使用してファイルの中身全部を一気に読み込んでしまう方法です。



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";


コンパイラ等流してのチェックはしていませんが、作成方針としてはこんな感じかと思います。
簡単な命令文だけで作ったつもりなので、これらよりもっと効率的で強力な関数をたくさん覚えて改良を目指してもらえればと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/21 00:46

特に難しいところはないはずだけど.... 何も考えずに書くけど


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;
くらい?
    • good
    • 1
この回答へのお礼

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

お礼日時:2007/11/21 00:50

「行の連結」という目的を達成するだけならば、



ファイルの全行を一気に読み込んで、改行 + タブ を 半角スペース に置換する

という方法はいかがでしょうか。

「現在の行を読みつつ次の行を読む方法は?」、という質問の答えにはなっていませんが... ;

------------------------------------------------------------------------------
#!/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;
------------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/21 00:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!