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

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,675

MasanariHori

score 17

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での読み込み時

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

宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

参考までに。

$data = file_get_contents("data/data.csv");   //ファイル読み込み
if(mb_detect_encoding($data, 'ASCII,JIS,UTF-8,CP51932,SJIS-win') == 'SJIS-win'){
    //文字コードを判定
    //文字コードが「SJIS-win」なら文字コード変換
    $data = mb_convert_encoding($data, 'UTF-8', 'SJIS-win');
}
$temp = tmpfile();  //一時ファイルを作成

$csv = array(); //読み込んだcsvのデータを格納する変数

// 一時ファイルにcsvのデータを書き込み
fwrite($temp, $data);
rewind($temp);

// csv読み込み
while(($data = fgetcsv($temp, 0, ',')) !== false){
    $csv[] = $data;
}
fclose($temp);    //ファイルを閉じる 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

  • 保存している時に使っているmb_convert_variablesを使う
    マニュアル

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/05 10:55

    > mb_convert_variables
    > 返り値:
    > 成功時に変換前の文字エンコーディングを返し、失敗した場合に FALSE を返します。

    mb_convert_variables は $array の中身のエンコードを変換します。
    $converted_array に変換後の結果が格納されるわけではありませんので、
    使用する際はお気を付け下さい。

    キャンセル

  • 2016/01/05 11:50

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

    キャンセル

-1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/04 19:21

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

    キャンセル

  • 2016/01/04 19:22

    途中ながら。。。。
    mb_convert_encodingの第1パラメータはstring型です。
    $arrayだと配列を渡しているので、エラーになります。

    $output_str = mb_convert_encoding($array[$i], 'utf-8', 'sjis-win');
    echo $output_str;

    でエラーは回避できるかと。

    キャンセル

  • 2016/01/05 08:51

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

    キャンセル

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる