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

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

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

Q&A

3回答

5116閲覧

PHPにおけるCSV読み込みについて

MH00214

総合スコア53

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

0グッド

0クリップ

投稿2016/01/04 08:24

PHP初心者です。

現在アンケートフォームを作っているのですが

①アンケート入力
②入力確認フォーム
③回答完了ページ(この時点でアンケート内容をCSVファイルに出力)
④回答内容を確認するためのページ(ここでCSVファイルを読み込み、表示)

という構成にしております。

③の時点で

//配列をcsvファイルに書き込む準備
$title = ['名前','出席番号','メールアドレス','性別','趣味','去年の一番の思い出','今年の抱負'];
$vararray = [$myid,$number,$mail,$gender,$hobby,$lastyear,$thisyear];
//文字列をUTF-8から変換
mb_convert_variables('SJIS-win', 'UTF-8', $title);
mb_convert_variables('SJIS-win', 'UTF-8', $vararray);
//ファイルへ書き込み実行
$handle = fopen('data/data.csv','a');
flock($handle,LOCK_EX);
fputcsv($handle,$title);
fputcsv($handle,$vararray);
flock($handle,LOCK_UN);
fclose($handle);

というコードを書き、正常にcsvファイルに書き込みがされています。

この時にエンコードをUTF-8からShift_JISに変更したので、④で読み込みをした際に、文字化けしてしまいます。
ブラウザでエンコードをShift_JISに変更したら文字化けは消えましたので、読み込んだ時点でShift_JISのエンコードになっているのはわかったのですが、それをUTF-8に戻す術がわかりません…。
最初はmb_convert_variables('SJIS-win', 'UTF-8', $変数);
で変更すればよいのかと思いましたが状況が変わらず
setlocale(LC_ALL, 'ja_JP.UTF-8'); というものも試してみましたが、こちらでもうまくいきませんでした。

現状は下記のコードですが、うまくいきません。

<?php setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen("data/data.csv", "r"); //ファイルを開く flock($fp, LOCK_SH); //ファイルロック while ($array = fgetcsv( $fp )) { //ファイルを読み込む $num = count($array); //行数カウント for($i=0;$i<$num;$i++){ echo '<p style="font-size:12px;">'.$array[$i].'</p>'; //とりあえず出力 } } flock($fp, LOCK_UN); //ロック解除 fclose($fp); //ファイルを閉じる ?>

UTF-8での読み込み時

詳しい方おりましたら、ご指摘いただければと思います。。

宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

CSVをダウンロードしてWindows(Excel)で使うのでしょうか?
ブラウザ内だけで完結する間は”UTF-8”でファイルに書き込み保持していれば良いと思います。
ダウンロードするタイミングで”SJIS-win”に変換する方がシンプルだと思います。

あくまでファイル上も"SJIS-win"でファイルを保持したい場合は以下になるかと思います。

  • mb_convert_encodingについては、他の皆様が書かれている通り第1引数はString型になります。

マニュアル

  • 保存している時に使っているmb_convert_variablesを使う

マニュアル

PHP

1while ($array = fgetcsv( $fp )) { 2 mb_convert_variables('UTF-8', 'SJIS-win', $array); 3 // 以下表示処理 4}

投稿2016/01/05 00:35

編集2016/01/05 06:10
icham

総合スコア559

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

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

r_ym

2016/01/05 01:55

> mb_convert_variables > 返り値: > 成功時に変換前の文字エンコーディングを返し、失敗した場合に FALSE を返します。 mb_convert_variables は $array の中身のエンコードを変換します。 $converted_array に変換後の結果が格納されるわけではありませんので、 使用する際はお気を付け下さい。
icham

2016/01/05 02:50

これは!使ったことあるのに失念してました。 ご指摘ありがとうございますm(__)m
guest

0

参考までに。

PHP

1$data = file_get_contents("data/data.csv"); //ファイル読み込み 2if(mb_detect_encoding($data, 'ASCII,JIS,UTF-8,CP51932,SJIS-win') == 'SJIS-win'){ 3 //文字コードを判定 4 //文字コードが「SJIS-win」なら文字コード変換 5 $data = mb_convert_encoding($data, 'UTF-8', 'SJIS-win'); 6} 7$temp = tmpfile(); //一時ファイルを作成 8 9$csv = array(); //読み込んだcsvのデータを格納する変数 10 11// 一時ファイルにcsvのデータを書き込み 12fwrite($temp, $data); 13rewind($temp); 14 15// csv読み込み 16while(($data = fgetcsv($temp, 0, ',')) !== false){ 17 $csv[] = $data; 18} 19fclose($temp); //ファイルを閉じる 20

投稿2016/01/05 00:02

orange0190

総合スコア1698

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

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

0

mb_convert_encodingを利用するとどうでしょうか?

投稿2016/01/04 08:27

orange0190

総合スコア1698

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

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

MH00214

2016/01/04 08:36

setlocale(LC_ALL, 'ja_JP.UTF-8'); を $array = mb_convert_encoding($array, 'UTF-8', 'SJIS-win'); と変更してみましたが、結果は変わりませんでした…。 $array = mb_convert_encoding($array, 'UTF-8', 'SJIS-win');を入れる場所が間違っているのでしょうか?
orange0190

2016/01/04 09:30

mb_convert_encodingを行うとしたら、出力を行っている箇所にしてみてください。
MH00214

2016/01/04 10:05

ありがとうございます!下記のコードを試してみましたが $fp = fopen("data/data.csv", "r"); //ファイルを開く flock($fp, LOCK_SH);//ファイルロック while ($array = fgetcsv( $fp )) { //ファイルを読み込む $num = count($array); //行数カウント for($i=0;$i<$num;$i++){ $array = mb_convert_encoding($array, 'UTF-8', 'SJIS-win'); echo '<p style="font-size:12px;">'.$array[$i].'</p>'; //とりあえず出力 } } flock($fp, LOCK_UN); //ロック解除 fclose($fp); //ファイルを閉じる と変更してみましたが Warning: mb_convert_encoding() expects parameter 1 to be string, array given in /Applications/XAMPP/xamppfiles/htdocs/php1226/show_enq.php on line 37 というエラーが返ってきてしまいました…。 自分でも色々と調べてみます!
orange0190

2016/01/04 10:21

mb_convert_encodingは第一引数に文字列を与えて、利用します。
Ruizi_Luigi

2016/01/04 10:22

途中ながら。。。。 mb_convert_encodingの第1パラメータはstring型です。 $arrayだと配列を渡しているので、エラーになります。 $output_str = mb_convert_encoding($array[$i], 'utf-8', 'sjis-win'); echo $output_str; でエラーは回避できるかと。
orange0190

2016/01/04 23:51

参考までに私が以前に作成したcsv読み込みのプログラムを別回答に載せます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問