「覚え間違い」を教えてください!

お世話になっております。

テキストファイルを読み込んで、データベースに格納をしたいと思っております。
全角と半角、全角スペースや半角スペースなどが混在しているため
意図した通りに読み込めません。

test.txt
--------------------------------------------------
山田 太郎     ヤマダ タロウ   神奈川県○○○区1-2-3       0312345678 ・・・1\n\r
高橋 花子     タカハシ ハナコ  東京都○○○○区4-5-6       0312345678 ・・・1\n\r
(カタカナは半角カタカナです。半角カタカナの後ろのスペースは半角スペースです。)

sample.php(EUC)
--------------------------------------------------
$fp = fopen($file_path, "r");
while (!feof($fp)) {
 // テキストファイルがShift-JISなのでEUC-JPに変換
 $row = mb_convert_encoding(fgets($fp), "EUC-JP", "Shift-JIS");
 // 全角スペースは半角スペース2に変換
 $line = str_replace(" ", " ", $row);

 $d['name'] = trim(mb_substr($line, 0, 20));
 $d['kana'] = trim(mb_substr($line, 20, 20));
 $d['address'] = trim(mb_substr($line, 40, 40));
 $d['tel'] = trim(mb_substr($line, 80, 20));
   :
   :
 $d['flag'] = trim(mb_substr($line, 1300, 1));
}

よろしくお願いいたします。

A 回答 (2件)

mb_substr(テキスト,開始位置,文字長)


の文字長は、バイトではありません。文字数ですので、
名前部分を取り出す時、元のデータでカナの前までという意味で文字数を指定する場合は20ではなく、10です。
(全角文字も半角文字も1文字と数える)
また、この処理をする前に、全角スペースを半角スペースにしていますが、全角スペースが含まれる数によって全体の文字長が変わってしまって固定長ではなくなってしまうので、
まず、切り分けてから、変換した方がよろしいでしょう。
    • good
    • 0

個人的感想ですが、mb_substrは動きが怪しげです。


この手は正規表現の方がいいんじゃないんですか?

$pat = "^(.+)\s(.+)\s+([ァ-ヶ]+)\s([ァ-ヶ]+)\s+(.+)\s+([0-9])";
$lines = file($file);//一行ずつ配列で一気に読込み
$i = 0;
foreach($lines as $line){
 $row = mb_convert_encoding($line,"EUC-JP", "Shift-JIS");
$row = mb_convert_kana($row,"s");//全角スペースを半角スペースに変換
if(mb_ereg($pat,$row,$reg)){
$sei[$i] = $reg[1];//姓
$mei[$i] = $reg[2];//名
$sei_k[$i] = $reg[3];//姓(カナ
$mei_k[$i] = $reg[4];
$address[$i] = $reg[5];
$tel[$i] = $reg[6];
}else{
echo "\n<br />{$row} はマッチしませんでした";
$err[$i] = 1;
}
$i++;
}

検証してませんが、こんなイメージでどうでしょう(笑。

この回答への補足

taketan_mydns_jpさん ご回答ありがとうございます。

テキストファイルの一行は、項目のバイト数が決まっているので
mb_substr() を使っています。
mb_substr() や mb_strcut() を使って出来ないでしょうか?

よろしくお願いいたします。

補足日時:2006/07/14 19:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報