

はじめまして、言語に疎いもので質問させて頂きます。
次のような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>;
}
質問内容もわかり辛いかと思いますがご教授頂けますでしょうか。
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";
コンパイラ等流してのチェックはしていませんが、作成方針としてはこんな感じかと思います。
簡単な命令文だけで作ったつもりなので、これらよりもっと効率的で強力な関数をたくさん覚えて改良を目指してもらえればと思います。
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;
くらい?
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;
------------------------------------------------------------------------------
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
- UNIX・Linux sedでの正規化 2 2022/05/10 11:39
- その他(ソフトウェア) 時間差でのオートクリック 1 2023/04/12 12:04
- Excel(エクセル) EXCEL マクロで 同じフォルダ内の複数ファイルの複数行全体を選択して1つのファイルに集約 4 2022/09/27 18:41
- その他(ブラウザ) zoomを開く際にEdgeのタブが増えるのでChromから開きたい。 毎回会議でzoomを開く際に、 1 2022/12/13 09:35
- ノートパソコン MacPCで、command+nを押したら、見ていたタブが消えて新しいタブが開かれてしまったのですが 2 2023/08/13 23:01
- ノートパソコン Windows10で画像のようなピクチャインピクチャ?を三つくらい並べて動画を3つ以上見たいんですが 1 2022/06/17 16:48
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- 電子マネー・電子決済 楽天edy残高をおサイフケータイへ 2 2022/09/30 18:10
- Excel(エクセル) Excelの列から検索して該当する行を別シートに転記するVBA 2 2022/12/20 09:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlの書き方
-
Perlでハードウェア制御?
-
携帯でのカウンタ
-
プログラムのヒントを下さい
-
改行コードが勝手に
-
ファイルから読み込んだ文字を
-
Perlでのファイル一括読み込み
-
perlでのスキンの利用方法
-
CSVファイルのダウンロードにつ...
-
空白を含む文をファイルに書き...
-
C言語で特定の行を抽出する方法...
-
log2の「正確な」計算方法
-
csv2wiki.plのエンコーディング...
-
ExcelをCSV書き出す場合のシー...
-
C言語でのファイルのデータ更...
-
Windowsで複数のファイルを同じ...
-
結果の表示を制限するには・・
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
【エクセル】改行無しテキスト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
where can I buy snowbord in t...
-
ファイルのロックについて
-
perlで複数のファイルの処理に...
-
perlを用いた特定文字列間の抽...
-
変数を使ってファイル名を自分...
-
open中のファイルをrename
-
文字列比較がどうしてもできま...
-
データの入れ替え処理が巧くで...
-
perlで大容量CSVのsort方法につ...
-
テキストファイルの本文中に行...
-
初歩的な質問で恐縮です。
-
パイプをopenして/usr/bin/grep...
-
perlでのスキンの利用方法
-
ログに記録又は読み出す際、最...
-
Perlのファイルオープン時...
-
Perlでハードウェア制御?
-
perlでファイル内の文字列を置...
おすすめ情報