[PHP-users 34927] Re: 固定長電文の解析

Yoshihiro Hanahara hanahara @ meiko.co.jp
2010年 1月 13日 (水) 14:04:05 JST


花原@明宏です。


解決されたようですが、固定長の文字列を切り出すのなら、unpack()も使えると
思います。
unpack()のフォーマット文字列の

    A10col1/A10col2/...

の'A10'の部分が10文字幅の空白で埋めた文字列(unpackされるときに空白は取り
除かれる)、'col1'が連想配列に入れるときのキー、'/'が区切り、らしいです。


# PHPのunpack()のドキュメントを読んでも、最初はよく分からなかった...(^_^;)。


<?php

$fp = fopen('test.txt','rb');
flock($fp, LOCK_SH);

while (! feof($fp)) {
    $buf = fgets($fp);
    if (rtrim($buf) == "enddata") {
        break;                  // 先頭が 'enddata'なら終了
    }

    // $buf の文字列を $ary['col1']〜$ary['col6'] に分解。
    $ary = unpack("A10col1/A10col2/A20col3/A30col4/A30col5/A30col6", $buf); // 文字列末尾の空白を取り除く場合
    //$ary = unpack("a10col1/a10col2/a20col3/a30col4/a30col5/a30col6", $buf);   // 文字列末尾の空白を取り除かない場合

    // 連想配列要素の文字コードを変換
    // 全部のカラムを文字コード変換かけてますが、不都合があるなら個別に変換
    foreach ($ary as $key => $value) {
        $ary[$key] = mb_convert_encoding($value,"utf-8","SJIS");
    }
    var_dump($ary);             // とりあえず確認、後にコメントアウト

    // 分解した各カラムを処理するコードを記述
    //....
}

fclose($fp);
?>


---
Yoshihiro Hanahara <hanahara @ meiko . co . jp>





PHP-users メーリングリストの案内