OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 暇なときにでも
  • 質問No.206793
  • 閲覧数220
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 70% (7/10)

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

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

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

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

と、やると、うまくいかない($kingaku2 の Length が 0 になってしまうような・・・)のですが・・・
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル9

ベストアンサー率 33% (33/98)

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";
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル11

ベストアンサー率 61% (157/255)

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

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

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

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

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

制作の参考にしてください。
お礼コメント
shinsa14

お礼率 70% (7/10)

ありがとうございます。
ファイルをBinmodeで読み込んででなかったため、レコードが読み込めてなかったようでした。
Binmode を指定したら、教えていただいたやり方で出来ました。
ありがとうございます。
投稿日時 - 2002-02-01 01:56:39
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ