- ベストアンサー
固定長レコードの取り扱い
ファイルから固定長のレコードを読み込んで、そのレコードから、ある項目をとりだしたいのですが・・・ レコードのフォーマット 名前 : Ch (8byte) 金額1: Int(4byte) 金額2: Int(4byte) 金額3: Int(4byte) ここから、金額2を取り出すには、どうしたら?・・・ $kingaku2 = substr($rec, 12, 4); と、やると、うまくいかない($kingaku2 の Length が 0 になってしまうような・・・)のですが・・・
- みんなの回答 (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";
その他の回答 (1)
- kokucho81
- ベストアンサー率61% (157/255)
shinsa14 さん、こんにちわ :-)。 $rec にちゃんとデータが入っているのであれば、 ($namae, $kingaku1, $kingaku2, $kingaku3) = $rec =~ m/(.{8})(.{4})(.{4})(.{4})/; で、一気に全部抽出することが出来ます。 これで抽出できないのであれば、$recの中にデータが入っていないか、 データが上述の形(8,4,4,4)になっていないかのどちらかになります。 制作の参考にしてください。
お礼
ありがとうございます。 ファイルをBinmodeで読み込んででなかったため、レコードが読み込めてなかったようでした。 Binmode を指定したら、教えていただいたやり方で出来ました。 ありがとうございます。