ファイルから固定長のレコードを読み込んで、そのレコードから、ある項目をとりだしたいのですが・・・

レコードのフォーマット
  名前 : Ch (8byte)
  金額1: Int(4byte)
  金額2: Int(4byte)
  金額3: Int(4byte)

ここから、金額2を取り出すには、どうしたら?・・・

$kingaku2 = substr($rec, 12, 4);

と、やると、うまくいかない($kingaku2 の Length が 0 になってしまうような・・・)のですが・・・

A 回答 (2件)

Windowsだったら、バイナリモードで開く必要があります。


http://tohoho.wakusei.ne.jp/wwwperl1.htm#Binary

開いた後の分解ですが、unpack 関数はどうでしょう?
http://tohoho.wakusei.ne.jp/wwwperl2.htm#unpack

($namae, $kingaku1, $kingaku2, $kingaku3) = unpack ("a8iii", $rec);

とすればOKだと思います。
確認を取ったコードを記しておきます。

$rec = "NameABC\0\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00";
($namae, $kingaku1, $kingaku2, $kingaku3) = unpack ("a8iii", $rec);
print $namae, "\n";
print $kingaku1, "\n";
print $kingaku2, "\n";
print $kingaku3, "\n";

参考URL:http://tohoho.wakusei.ne.jp/wwwperl1.htm#Binary, http://tohoho.wakusei.ne.jp/wwwperl2.htm#unpack
    • good
    • 0

shinsa14 さん、こんにちわ :-)。



$rec にちゃんとデータが入っているのであれば、

($namae, $kingaku1, $kingaku2, $kingaku3) = $rec =~ m/(.{8})(.{4})(.{4})(.{4})/;

で、一気に全部抽出することが出来ます。

これで抽出できないのであれば、$recの中にデータが入っていないか、
データが上述の形(8,4,4,4)になっていないかのどちらかになります。

制作の参考にしてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ファイルをBinmodeで読み込んででなかったため、レコードが読み込めてなかったようでした。
Binmode を指定したら、教えていただいたやり方で出来ました。
ありがとうございます。

お礼日時:2002/02/01 01:56

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


人気Q&Aランキング