プログラム初心者です。
よろしくお願いします。
下記のように項目分けされたデータがあります。
--
【項目1】あいうえお
【項目2】かきくけこ
【項目3】さしすせそ
【項目4】
123456789
【項目5】
987654321A
012345678B
【項目6】たちつてと
【項目7】なにぬねの
--
このデータの中から【項目2】、【項目4】、【項目5】データを抽出したいのですが、うまくいきません。
つまり、下記のように抽出したいのです。
--
【項目2】かきくけこ
【項目4】
123456789
【項目5】
987654321A
012345678B
--
現在は、
while(<STDIN>)でファイルを行ごとに読み込みまして
if(/【項目2】/){
print ;
}
if(/【項目4】/){
print ;
}
if(/【項目5】/){
print ;
}
としているのですが、これでは改行されいる項目4と項目5の内容部分が抽出できません。
このデータも取り出すためには、どのようにすれば良いのでしょうか?
PERLを始めて1週間でして、簡単なことかもしれませんが、ご教授ください。
よろしくお願いします。
No.1
- 回答日時:
1行ずつ読み込んで判断・処理するのではなく、先に読み込んで項目ごとにデータをまとめてから処理するとよいと思います。
例えばこんな感じ。
# 項目ごとにデータをまとめる配列を用意
@data = ();
# 読み込みながら、項目ごとにまとめる
while (<STDIN>) {
# 項目名の行なら、新しいデータとして @data に追加
if (/^【項目.+】/) { push @data, $_ }
# 違うなら、@data の最後のデータに連結
else { $data[-1] .= $_ }
}
これで項目1~7が $data[0]~$data[6] に入るので、
print $data[3];
とすれば
【項目4】
123456789
と表示されます。
※スクリプトをコピーする場合は、全角スペースをタブなどに置換して下さい。
ありがとうございます。
配列を使うと良いのですね。参考になりました。
私の質問の仕方が悪く、大変恐縮なのですが、
ファイルは複数ありまして、データ内の項目数もファイルによって違いがあります。重なる項目もあります。
そのため、print $data[3];としてもファイルによって抽出される項目が違ってきます。
ただし、抽出する項目は、全ファイル同様です。
できましたら、【項目2】、【項目4】、【項目5】という抽出したい項目のみを配列に入れまして、全ファイルとも同様の項目で出力したいと考えています。
よろしくご教授ください。
No.2ベストアンサー
- 回答日時:
なるほど、項目名で抽出する必要があったのですね。
でしたら配列の変わりにハッシュを利用すると良さそうです。
%data = ();
$key = "";
while (<STDIN>) {
if (/^(【項目.+?】)/) { $data{$key=$1} = $_ }
else { $data{$key} .= $_ }
}
このようにすると、print $data{"【項目4】"} のように使うことができます。
※この例では項目名をそのままハッシュのキーにしましたが、項目番号だけを取り出してキーにしても構いません。
※else 部で最後の要素にデータを連結する際、配列では $data[-1] で最後尾にアクセスできましたが、ハッシュではそのような手段がないので、最後に追加したキーを変数($key)で覚えておくようにしています。
なお、複数のファイルがあるということなので、ファイルオープンなども含めて関数化してしまうとよいでしょう。
sub read_item_file {
my ($file_name) = @_;
my (%data, $key);
open FH, $file_name or die "$file_name:$!";
while (<FH>) {
if (/^(【項目.+?】)/) { $data{$key=$1} = $_ }
else { $data{$key} .= $_ }
}
close FH;
return \%data;
}
# 利用例
my @item_list;
push @item_list, read_item_file("item1.dat");
push @item_list, read_item_file("item2.dat");
:
foreach my $data (@item_list) {
print $data->{"【項目4】"}, "\n";
}
返信が遅くなり申し訳ありません。
いろいろと試してみまして、ハッシュを使った方法が一番うまくいきそうです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- Excel(エクセル) エクセルの関数 2 2023/01/17 15:24
- Excel(エクセル) Formulaプロパティーを使ってセルに数式を組んだのですが簡潔にしたい。 3 2022/08/21 20:51
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- 専門学校 学校のパソコンの授業で「自分の好きなこと(趣味のあること)」をテーマに5分程度の発表があります。 前 2 2023/07/03 18:42
- 会計ソフト・業務用ソフト エクセルです 2 2022/09/17 12:14
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
データの値の近いものをグルー...
-
【Excel VBA】10進数を2進数に...
-
途中経過も表示するプログラム
-
エクセルVBA:日付データの変換...
-
matlabのソースコードをpython...
-
C言語の構造体にてバブルソート...
-
stable diffusionのエラー
-
C言語の勉強しています。すみま...
-
pythonでDBのカラム名で取得し...
-
オセロゲーム 2次元配列で困...
-
C言語についてです! 同じ年の...
-
python 気象データの取得
-
'dataType' 引数を Null にする...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
number 改行が追加できない
-
エクセルシート名の制限を変更...
-
ビットスワップとバイトスワッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
int型(2バイト)データの分割
-
c言語の多次元配列で1から100ま...
-
C#でのswitch文
-
【Excel VBA】10進数を2進数に...
-
途中経過も表示するプログラム
-
CreateProcessでの環境変数の設...
-
pythonでDBのカラム名で取得し...
-
C言語についてです! 同じ年の...
-
linuxのシェルでファイル名に先...
-
c言語 配列から数字だけをint型...
-
c言語での wavファイルの編集(...
-
matlabのソースコードをpython...
-
ビットデータのチェック方法
-
10個の実数に対する降順ソート...
-
python 気象データの取得
-
C言語の構造体にてバブルソート...
おすすめ情報