- ベストアンサー
fgetcsvでCSVを取得した際のnullに関し
phpでfgetcsv関数を使用して、取得したデータをDBに登録するという作業を行いたいと考えています。 ですが、CSVでNULLの部分の取得が上手くいっていないようで、DBには「NULL」という文字列で取り込まれてしまいます。 「\N」にすることでNULLとして登録出来るという情報があったので、CSVを修正して「NULL」を「\N」にしてみたのですが、やはり「\N」という文字列として登録されてしまいました。 正常にNULLとして認識させるにはどのような対応を行えば良いのでしょうか。 よろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
fgetcsvでは、すべての要素が文字列として取り込まれます。例外的に「改行のみ」の行だと要素数が1でその値がNULLになりますが、それ以外では(空文字列はあっても)NULLはありません。 >CSVでNULLの部分の取得が上手くいっていない CSVファイルで「NULLの部分」とはどういうものなのでしょうか。ちょっと想像出来ません。「空文字列」をNULLとして扱いたいということでしょうか?
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
そもそも文字列カラムにNULLを指定する意味がないので ''(長さ0の文字)でよいような気がします。 場合によっては、「NULL」という文字列をデータ投入後 UPDATE テーブル SET カラム=NULL WHERE カラム='NULL' のような処理でもいいかもしれません。
お礼
回答頂きありがとうございました。 DB内でカラムによっては空文字列とNULLを使い分けている部分があったので、NULLはNULL、空文字は空文字として一応分けておきたいとい考えておりました。 今回はDB登録の前にNULLを変換するという形を取りましたが、yambejpさんの記述して頂いた内容も、今後参考にさせて頂きます。 ありがとうございました。
- yambejp
- ベストアンサー率51% (3827/7415)
fgetcsvで得たデータをどうやってSQLに渡そうとしていますか?
補足
フレームワークにsymfonyを使用しているので、symfonyのDB登録方法で下記のように行なっています。 if($row[0]){ // 更新 $item = Doctrine::getTable('T_USER')->find($row[0]); } else { // 新規 $item = new T_USER(); } $item->setUserId($row[1]); $item->setName($row[2]); $item->save(); ※$rowの中には1件分(CSVで1行分)のレコードが入っています。 fgetcsvでファイルを取得した際にはすでに文字列となっているようです。
お礼
回答ありがとうございます。 >fgetcsvでは、すべての要素が文字列として取り込まれます。 上記のことを参考に、CSVに保存する際はNULLを文字列として保存して、DBに保存する際は、SQLを行なう前にNULL文字列から、実際のNULLに変換するという処理を行いました。 実際はもっと良い方法があるのかもしれませんが、今のところこの方法で問題なさそうなので、こちらでいきたいと思います。 ほんとうにありがとうございました。
補足
>CSVでNULLの部分の取得が上手くいっていない 申し訳ありません、上記の記述が良くありませんでした。 正確には私自分でもどのようにすればNULLとして受け取ってもらえるか分からなかったため、文字列でNULLと入れてみたり、「\N」と入れてみたりと試してみました。 agunuzさんが言うように、すべて文字列となってしまうのであれば、CSVに文字列でNULLと入っていた場合には、実際のNULLに変換するなどして対応するのが良いでしょうか?