• ベストアンサー

ファイルから読み込み

お世話になっております。 テキストファイルを読み込んで、データベースに格納をしたいと思っております。 全角と半角、全角スペースや半角スペースなどが混在しているため 意図した通りに読み込めません。 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)); } よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

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

その他の回答 (1)

回答No.1

個人的感想ですが、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++; } 検証してませんが、こんなイメージでどうでしょう(笑。

wonder_dct
質問者

補足

taketan_mydns_jpさん ご回答ありがとうございます。 テキストファイルの一行は、項目のバイト数が決まっているので mb_substr() を使っています。 mb_substr() や mb_strcut() を使って出来ないでしょうか? よろしくお願いいたします。

関連するQ&A

  • 正規表現

    質問させていただきます。 文字コード「Shift-JIS」で渡ってきた文字列を 英字とスペースはOKで、 それ以外の文字列が入力されていたら、エラーいう処理を しているのですが、うまくいきません。 ご教授よろしくお願いします。 // 半角にする $kana = mb_convert_kana($_POST['kana'], "r"); if ((ereg("^[a-zA-Z]+$", trim($kana))) == false) {   echo "エラーです"; } 全角スペースと半角スペースと英字はOKで、それ以外はNG としたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPで指定文字数で切りたい場合

    PHPで、全角と半角の混在した文字列で 全角=1文字、半角=0.5文字として換算した文字数を切り詰めたい場合は どうすれば良いのでしょうか?? 改行コードなどもカウント出来たら尚良いです! 環境は PHPのソースコードはutf-8 入出力はShift-jis ・mb_substrは、半角も1文字とカウントされてしまいます ・mb_strimwidthは、文字幅なので今回は使い物になりません ・mb_strcutはなぜかうまく動いてくれません $str = mb_convert_encoding($str,'shift-jis','utf-8'); $str = mb_strcut($str,0,1000,'shift-jis'); $str = mb_convert_encoding($str,'utf-8','shift-jis'); 500文字になるのを期待したが、出力された文字は512文字になってしまった 全角=1文字、半角=0.5文字の検証は以下のサイトにて行いました http://www.luft.co.jp/cgi/str_counter.php お忙しい中恐縮ですが、 わかる方お教えくださいませ!

    • ベストアンサー
    • PHP
  • HYMLファイルの書換えに伴う文字化け

    質問させて下さい。 共有サーバーで複数のドメインを管理・運営しており、各ドメインのindex.htmlの内容を書換えたいと考えております。 サーバーのディレクトリ構造はこんな感じ。 public_html  |  |- sample1.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample2.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample3.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample4.com(フォルダ)  |    |  |    + index.html(Shint_JIS)  |  +-un_txt.php(実行ファイル EUC-JP) この上記構成にある、un_txt.phpというファイルにアクセスすることで、各フォルダ内にあるindex.html内の内容を書換えたいと思っているのですが、PHPはEUCで指定しており、書換えたい各htmlファイルはShift_JISとなっているためか、実行すると文字化けが発生してしまいます。 以下は現時点てのスクリプト、そのままですが、どこがおかしいのかご指摘頂くことは可能でしょうか? <?php $text_data = array("ホームページ", "アイフォン", "スマートフォン"); $array = scandir("./"); mb_convert_variables("EUC-JP", "SJIS", $array); for($i=0; $i<count($array); $i++){ $name = trim($array[$i]); $dir_name = "./".$name; $html = "./".$name."/index.html"; if(is_readable($html)){ @chmod($html, 0606); $addstr = file_get_contents($html); $fp=@fopen("$html","r"); $no = ''; if($fp){ $main = ""; while (!feof($fp)){ $no++; $main .= fgets($fp,1000); } } for($m=0; $m<count($text_data); $m++){ $txt = $text_data[$m]; $no_txt = " "; //$text_data配列に登録されているキーワードを削除。 //削除出来ないため、$no_txt では半角スペースを与えている。 $main = strtr($main, $txt, $no_txt); } $main = mb_convert_encoding($main,"SJIS","EUC-JP"); $fp=fopen($html, "w"); fputs($fp,$main); fclose($fp); } } 以上、お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 入力フォームでの半角全角スペース、タブをそのまま反映したい。

    入力フォームに入力した半角スペース全角スペース 、タブをそのまま反映させて、 フォーム入力とほぼ同じ形で、Web上に表示させたい のですが。 単純に置き換えるだけですが、\r\nを<br>には 置き換えています。 スペースがよく分かりません。 また、タブは、入力フォームに入力できないのでしょ うか(フォームを移動してしまう)。 ちなみに、文字コードは、Shift_JISです。 単純に、Shift_JISだと、スペースはこうだから、 こういったタグに置き換える、といった感じが、 ありがたいです。

    • ベストアンサー
    • CGI
  • Pythonファイル読み書きについて

    ファイル読み書きで躓いています。 やりたい事は、以下の5行のa.txtを読んで、b.txtに吐き出します。 a.txt  1First Row  2Second Row  3行目  (4)         ※4が○で囲まれてるやつ  5行目 以下コードです。 import codecs fin = codecs.open(r'D:\Work\a.txt', 'r', 'shift-jis') fout = codecs.open(r'D:\Work\b.txt', 'w', 'shift-jis') for line in fin: print line fout.write(line) fin.close() fout.close() 4行目でエラーとなります。 これを正常動作させる事はできるのでしょうか? よろしくお願いします。

  • この先困っています。

    この先困っています。 あるサイトで下記プログラムを見つけましたが その先で困っております。ご教授お願い致します。 ------------------------------ <?php //書き込みファイル設定 $filename = "log.txt"; $fp = fopen($filename, "w"); //ログファイル配列処理 $arr = file("./manager/data.dat"); //書き込み開始 foreach ($arr as $line) { $lines = explode("&&", $line); fwrite($fp, $lines[1]); $lines[1]= mb_convert_encoding($lines[1], "Shift_JIS", "EUC"); //echo "<a href=$lines[1]>".$lines[1]."</a></br>\n\n\n"; } //書き込み終了 fclose($fp); ?> ------------------------------ 1.EUCでかかれた下記ログを読み込みShift_JISに文字変換したい。       $arr = file("./manager/data.dat");//EUC       $filename = "log.txt";//shift_JIS に変換したい 2.書き込んだログがべたでつながっているので改行したい。        fwrite($fp, $lines[1]);//改行で保存したい あるプログラムのログを活用して別のプログラムで利用したいのですが 文字コードで困っています。 どうかよろしくお願い致します。

    • ベストアンサー
    • PHP
  • [Ruby]外部ファイルの全角文字削除ができない原因を教えてください

    Rubyでの全角文字削除について質問です。 (環境:Windows XP,cygwin) コマンドライン引数で指定した外部ファイルを読み込んで全角文字を削除しようとすると、 全角文字が削除できないのですが、この原因がわかる方がいらしゃいましたら教えてください。 ・外部ファイル(Shift_JIS,改行=CR+LF) "7桁の| 郵便番号を| 入力して|,ください" ・Rubyスクリプト(cygwin上のため、EUC-JP,改行LF) #file.each_line do |line| # line.gsub!(/ /,'') # line.gsub!(/,/,'') # line.gsub!(/|/,'') #end 全角スペース、全角カンマ、全角パイプラインすべて削除できません。 半角文字は上記方法で削除できます。 しかし、スクリプト中に以下のような記述をすると、 #text = "7桁の 郵便番号を 入力して,ください" #print text.gsub(/ |,/,'') 「7桁の郵便番号を入力してください」と全角文字が削除されて表示されます。 教えてください。 よろしくお願いします。

  • 絞込み検索(and検索)について

    PHPの勉強をしています。色々試してみたのですが解決までいたらなかったのでご相談させて頂きます。 テストで検索を掛けたら下記のようなエラーが発生しました。 Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in C:\Program Files\xampp\htdocs\PHPSAMPLE\sample_php\search.php on line 19 上記のエラーは $KeyWord=mb_convert_encoding($KeyWord,"Shift_JIS","auto"); を外す事でエラーにならず検索する事ができました。 ■ソース --------------------------------------------------------------------------- 13 if($_GET["key"]==""){ 14 print"キーワードを入力してください"; 15 }else{ 16 $KeyWord=$_GET["key"]; 17 $KeyWord=htmlspecialchars($KeyWord); 18 $KeyWord=mb_convert_encoding($KeyWord,"Shift_JIS","auto"); 19 $KeyWord=mb_convert_kana($KeyWord,s); 20 $ArrKeyword=explode(" ",$KeyWord); --------------------------------------------------------------------------- つづいて、区切りに使われるスペースを「半角」「全角」どちらでも対応できるように 「全角スペース」が入力された場合、すべて半角スペースに統一するようになっているはずなんですが 例)フルーツ リンゴ と全角スペースで絞り込んだ場合。検索結果が0と表示されてしまいます。 半角スペースで絞り込んだ場合。表示結果が1件と正常に表示されます。 ■ソース --------------------------------------------------------------------------- 13 if($_GET["key"]==""){ 14 print"キーワードを入力してください"; 15 }else{ 16 $KeyWord=$_GET["key"]; 17 $KeyWord=htmlspecialchars($KeyWord); 18 $KeyWord=mb_convert_kana($KeyWord,s); 19 $ArrKeyword=explode(" ",$KeyWord); --------------------------------------------------------------------------- mb_convert_kanaで「全角」スペースを「半角」に変換するように設定し explodeで文字列を半角スペースで分割するようにしているはずなんですけど うまく機能しません。。。 記述方法が間違っているのか?何かがたらないのか? 自分なりに考えたのですが改善策が見つかりません。 どなたか知恵を貸して頂ければと思います。 宜しくお願いいたします。

    • 締切済み
    • PHP
  • Excel2010英数字のみ半角にする方法

    タイトルのほかにも条件があるのですが、Excel2010で、表示結果に条件があります。 既存に入力されているものなんですが、条件は以下の通りです。 条件1:漢字あるいは、ひらがなはそのまま 条件2:全角カタカナは全角カタカナ 条件3:半角カタカナは全角カタカナ 条件4:全角英数字は半角英数字 条件5:半角英数字は半角英数字 条件6:全角スペースは全角スペース 条件7:半角スペースは全角スペース 条件8:スペースが連続している場合は全角スペース1つのみ 例としては(左側が既存、右側が表示結果)、 全角あいうえお→全角あいうえお 全角アイウエオ→全角アイウエオ 半角アイウエオ→半角アイウエオ 全角110→全角110 半角アイウエオ全角110→半角アイウエオ全角110 半角アイウエオ□全角110→半角アイウエオ□全角110 半角アイウエオ□□全角110→半角アイウエオ□全角110 半角アイウエオ△□全角110→半角アイウエオ□全角110 半角アイウエオ△全角110→半角アイウエオ□全角110 半角アイウエオ△△全角110→半角アイウエオ□全角110 半角アイウエオ△△△全角110→半角アイウエオ□全角110 ※「□」は全角スペース、「△」は半角スペースです。分かりやすいように表記してみました。「□」または「△」が複数ある場合、スペースの個数です。 既存の入力されている列は「AE列」です。関数を入力できるのは「AR列」以降です。 関数について詳しくないため、あまり長いお礼はできませんが、回答よろしくお願いします。

  • メールの内容が文字化けします・・・

    <? function sendmail($to,$from,$from_name,$title,$message){ /* EUCコードへのエンコーディング */ $to = mb_convert_encoding($to , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $from = mb_convert_encoding($from , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $title = mb_convert_encoding($title , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $message = mb_convert_encoding($message , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); /* 改行コード変換(CR+LFへ変換) */ $to = ereg_replace("\r", "", $to); $to = ereg_replace("\n", "\r\n", $to); $from = ereg_replace("\r", "", $from); $from = ereg_replace("\n", "\r\n", $from); $from_name = ereg_replace("\r", "", $from_name); $from_name = ereg_replace("\n", "\r\n", $from_name); $title = ereg_replace("\r", "", $title); $title = ereg_replace("\n", "\r\n", $title); $message = ereg_replace("\r", "", $message); $message = ereg_replace("\n", "\r\n", $message); /* メールヘッダ生成 */ $header = "From: ".$from_name." <".$from.">\n"; $header .= "Reply-To: ".$from_name." <".$from.">\n"; /* メール本文生成 */ $message = mb_convert_kana($message,"KV"); /* 送信メッセージ言語設定 */ mb_language("Japanese"); /* メール送信処理 */ $rcd = mb_send_mail($to,$title,$message,$header); return $rcd; } ?> 何が原因か分からないのです・・・。 教えていただければ嬉しいですm(__)m

    • ベストアンサー
    • PHP

専門家に質問してみよう