[PHP-users 34912] 固定長電文の解析

abs kenken_abs @ leto.eonet.ne.jp
2010年 1月 4日 (月) 04:52:17 JST


はじめまして。
absと申します。

----環境----
Win XP SP2
IIS V5.1
PHP V5.2.3 (ISAPで動作)
SQLite V3.3.17
------------

他のデータベース(Oracle)から
データ連携するのに、
毎日固定長データのファイルが送られてきます。
これを、コマンドラインPHPで起動させ、
SQLiteのデータベースへデータを取り込みたいのですが、
ファイルからデータを取得するところでうまくいきません。

サンプルは、1レコード(1データ)130バイトの固定長で、

0〜10カラム
11〜20カラム
21〜40カラム
41〜70カラム
71〜100カラム
101〜130カラム

以上6個のデータが1レコードになっています。
そして空きはすべて半角空白で埋められています。

---ソース---
<?php
//読込テスト
$filenam = 'test.txt';
$fp = fopen($filenam,'rb');
flock($fp,LOCK_SH);
//1行目のstratデータ読み取り
 $str = fgets($fp);
 echo "長さ:".strlen($str).'</br>';
//2行目からのデータ取得
while(!feof($fp)){
 $str = fgets($fp);
//わかりやすいように半角空白を0で埋める(実際はこの処理はしない)
 $str=strtr($str,' ',0);
//文字コードをSJIS⇒UTF8に変換
 $str=mb_convert_encoding($str,"utf-8","SJIS");
//参考に読み込んだ1行のデータ長を表示
 echo "長さ:".strlen($str).'</br>';
//各カラムのデータ表示
 $str_1 = mb_strcut($str,0,9);
 $str_2 = mb_strcut($str,11,10);
 $str_3 = mb_strcut($str,21,20);
 $str_4 = mb_strcut($str,41,30);
 $str_5 = mb_strcut($str,71,30);
 $str_6 = mb_strcut($str,101,30);

 echo "データ1:".$str_1.'</br>';
 echo "データ2:".$str_2.'</br>';
 echo "データ3:".$str_3.'</br>';
 echo "データ4:".$str_4.'</br>';
 echo "データ5:".$str_5.'</br>';
 echo "データ6:".$str_6.'</br>';
}
echo '読込終わり';
$fp = NULL;
?>
---ソース終わり---

--------------実行結果----------------------
長さ:132
長さ:170                                                ⇒長さ:130
データ1:abcdef000                                  ⇒データ1:abcdef0000
データ2:234000000                                 ⇒データ2:1234000000
データ3:試験00000000000000                   ⇒データ3:試験0000000000000000
データ4:0シケン00000000000000000000        ⇒データ4:シケン000000000000000000000000000
データ5:0000000試験入力です00000         ⇒データ5:試験入力です000000000000000000
データ6:0000000000000シケンニュ                 ⇒データ6:シケンニュウリョクデス000000000000000000
長さ:188
--省略--
長さ:198
--省略--
長さ:197
--省略--
長さ:210
--省略--
長さ:20
--enddata--
読込終わり
-----------実行結果終わり-------------------------------
----------test.txtの内容---------------------------------
startdata
abcdef    1234      試験                シケン                           試験入力です                  シケンニュウリョクデス
abcdef    5678      次の試験            ツギノシケン                       次の試験入力です              ツギノシケンユウリョクデス
abcdef    9012      次々試験            ジジシケン                       次の次の試験入力です          ツギノツギノシケンユウリョクデス
abcdef    9012      その次試験          ソノツギシケン                      その次の試験入力です          ソノツギノシケンユウリョクデス
abcdef    9012      その次々試験        ソノジジシケン                     その次の次の試験入力です      ソノツギノツギノシケンユウリョクデス
enddata
----------test.txtの終わり---------------------------------


1行あたりの読み取られたデータの長さも一定ではなく、
こちらが思っているオフセットでデータ取得ができません。
⇒の後のデータのような出力結果を期待していたのですが・・・。

すみませんが、どなたかご教授ねがいます。
以上よろしくお願いします。




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