• ベストアンサー

固定長レコードの取り扱い

ファイルから固定長のレコードを読み込んで、そのレコードから、ある項目をとりだしたいのですが・・・ レコードのフォーマット   名前 : Ch (8byte)   金額1: Int(4byte)   金額2: Int(4byte)   金額3: Int(4byte) ここから、金額2を取り出すには、どうしたら?・・・ $kingaku2 = substr($rec, 12, 4); と、やると、うまくいかない($kingaku2 の Length が 0 になってしまうような・・・)のですが・・・

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

  • ベストアンサー
  • sssohei
  • ベストアンサー率33% (33/98)
回答No.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

その他の回答 (1)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.1

shinsa14 さん、こんにちわ :-)。 $rec にちゃんとデータが入っているのであれば、 ($namae, $kingaku1, $kingaku2, $kingaku3) = $rec =~ m/(.{8})(.{4})(.{4})(.{4})/; で、一気に全部抽出することが出来ます。 これで抽出できないのであれば、$recの中にデータが入っていないか、 データが上述の形(8,4,4,4)になっていないかのどちらかになります。 制作の参考にしてください。

shinsa14
質問者

お礼

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