質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

5107閲覧

文字コードsjisの変換について

T.FUJII

総合スコア21

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/02/20 08:11

編集2018/02/21 09:15

###前提・実現したいこと

全体の流れ

DBからCSVファイルを出力 → ユーザがそのCSVファイルをエクセルで編集 → DBにCSVファイルを入力

の ”DBにCSVファイルを入力” 部分の質問になります。
このプログラムはartisanコマンドで呼び出され実行されます。
csvを読み込んで配列に格納し、その配列をもとにDBのデータを更新するプログラムです。

###発生している問題・エラーメッセージ

下記のエラーが出てしまいました。

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'phone_number' at row 16876

###該当のソースコード

該当箇所をvar_dumpで見ると下記のようになっており、

php

1array(11) { 2 [0]=> 3 string(13) "001r357820094" 4 [1]=> 5 string(3) "001" 6 [2]=> 7 string(57) "あいう機構",00-1234-5678""

csvの区切り文字がうまく読まれません。本来は[3]に下記のように入るはずです。

php

1array(10) { 2 [0]=> 3 string(13) "001r357820094" 4 [1]=> 5 string(3) "001" 6 [2]=> 7 string(57) "あいう機構" 8 [3]=> 9 string(12) "00-1234-5678"

初心者ながら自力で調べたところ0x5c問題というもので、構の文字の2バイト目が¥になり,がエスケープされているということに気が付きました。

しかし読み込まれるcsvの文字コードはsjis(エクセルの保存関係で)であり、それをうまくデータベースに戻さなければならず、どう解決すればいいかわかりません。

またsjisのファイルをsjis-winとしてmb_convert_variablesをかけていいのでしょうか?そうすることでハシゴの高(髙)などの問題は解決できました。しかしそれがやっていいことなのかはわかっていません。

csvの読み込みは、下記のようにSplFileObjectを使い、それをlist関数を使い変数に詰めています。
(変数名$aなどは簡略化して書いています)

php

1public function handle() 2{ 3 // CSVファイル読み込み 4 $filePath = './aaa.csv'; 5 $file = new SplFileObject($filePath); 6 $file->setFlags(SplFileObject::READ_CSV); 7 8 // ファイル内のデータをループ 9 foreach ($file as $row) { 10 // 文字コード変換 11 mb_convert_variables('utf8', 'sjis-win', $row); 12 13 // list関数を使い変数にデータを格納 14 list( 15 $a, 16 $b, 17 $c, 18 $d, 19 $e, 20 $f, 21 $g, 22 $h, 23 $i, 24 $j, 25 $k 26 ) = $row; 27

その後、DBは下記のようにクエリービルダーを使い必要項目だけアップデートしています。
DBはutf8-unicode-ciでMySQLを使っています。

php

1// CSVから取得したデータをDBに戻す 2DB::table('test_database')->where('a', $a)->update([ 3 'b' => $b, 4 'c' => $c, 5 'updated_at' => date("Y-m-d H:i:s") 6]);

###補足情報(言語/FW/ツール等のバージョンなど)

開発環境:Vagrant + VirtualBox / Homestead
言語:php-7.1.14 (NTS)
フレームワーク:Laravel5.5 (LTS)
サーバー:nginx
DB:MySQL

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

php

1       // (略) 2 if(isset($row[2])) { 3 $company_name = $row[2]; 4 # 電話番号検索 5 $flg = false; 6 # 異常値から電話番号を抽出 ["あいう機構",03-5555-6666""] 7 if(preg_match('/([0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4})/', $company_name, $match)) { 8 $phone_number = $match[0]; 9 # 異常値から電話番号の削除 ["あいう機構",""] 10 $company_name = str_replace($phone_number, '', $company_name); 11 # 異常値から\,\を削除 ["あいう機構"] 12 $company_name = str_replace("\",\"", '', $company_name); 13 $flg = true; 14 } 15 }; 16 if(isset($row[3])) { 17 if($flg) { 18 $mail_address = $row[3]; 19 } else { 20 $phone_number = $row[3]; 21 } 22 }; 23 // (略)

ごり押しかもしれませんが、list関数を止め上記のようにして解決しました。

投稿2018/02/22 02:45

T.FUJII

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

mb_convert_variables()やmb_convert_encoding()を使ってSJIS-winからUTF-8に変換しないと、
お気づきのように正しく処理できないと思われます。

あと、Excelで加工するとのことなので、
例えばCSVでなくxlsやxlsxをphpから読み書きする方法もありますね、
PHPExcel(保守されてないので非推奨)とかPHPSpreadsheetとか。
PHPExcelの後継っぽいPhpSpreadsheetでExcelファイルを読み書きするサンプルコード - ariarijp’s blog
PhpSpreadsheetを試してみる(テンプレート読み込み・セルの結合・スタイル設定・CSV出力) - Qiita

投稿2018/02/21 09:33

編集2018/02/21 09:36
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.FUJII

2018/02/22 01:10 編集

m6u様 ありがとうございます。 確かにExcelファイルでやる方がいい気がします。 参考にさせていただきます。 今今自分なりに解決方法はどれも無理やりな感じです。 ①DBにデータをインサートする時点で0x5c文字はエスケープする ②ユーザにはエクセル以外のcsvエディタでutf8として編集してもらう ③エクセルでcsvを編集する場合は下記手順でutf8にしてもらう https://goo.gl/NKX8sV
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問