- ベストアンサー
ファイルから読み込み
お世話になっております。 テキストファイルを読み込んで、データベースに格納をしたいと思っております。 全角と半角、全角スペースや半角スペースなどが混在しているため 意図した通りに読み込めません。 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)); } よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
mb_substr(テキスト,開始位置,文字長) の文字長は、バイトではありません。文字数ですので、 名前部分を取り出す時、元のデータでカナの前までという意味で文字数を指定する場合は20ではなく、10です。 (全角文字も半角文字も1文字と数える) また、この処理をする前に、全角スペースを半角スペースにしていますが、全角スペースが含まれる数によって全体の文字長が変わってしまって固定長ではなくなってしまうので、 まず、切り分けてから、変換した方がよろしいでしょう。
その他の回答 (1)
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
個人的感想ですが、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() を使って出来ないでしょうか? よろしくお願いいたします。