• ベストアンサー

fgetcsvでCSVを取得した際のnullに関し

phpでfgetcsv関数を使用して、取得したデータをDBに登録するという作業を行いたいと考えています。 ですが、CSVでNULLの部分の取得が上手くいっていないようで、DBには「NULL」という文字列で取り込まれてしまいます。 「\N」にすることでNULLとして登録出来るという情報があったので、CSVを修正して「NULL」を「\N」にしてみたのですが、やはり「\N」という文字列として登録されてしまいました。 正常にNULLとして認識させるにはどのような対応を行えば良いのでしょうか。 よろしくおねがいします。

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

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

fgetcsvでは、すべての要素が文字列として取り込まれます。例外的に「改行のみ」の行だと要素数が1でその値がNULLになりますが、それ以外では(空文字列はあっても)NULLはありません。 >CSVでNULLの部分の取得が上手くいっていない CSVファイルで「NULLの部分」とはどういうものなのでしょうか。ちょっと想像出来ません。「空文字列」をNULLとして扱いたいということでしょうか?

non05410
質問者

お礼

回答ありがとうございます。 >fgetcsvでは、すべての要素が文字列として取り込まれます。 上記のことを参考に、CSVに保存する際はNULLを文字列として保存して、DBに保存する際は、SQLを行なう前にNULL文字列から、実際のNULLに変換するという処理を行いました。 実際はもっと良い方法があるのかもしれませんが、今のところこの方法で問題なさそうなので、こちらでいきたいと思います。 ほんとうにありがとうございました。

non05410
質問者

補足

>CSVでNULLの部分の取得が上手くいっていない 申し訳ありません、上記の記述が良くありませんでした。 正確には私自分でもどのようにすればNULLとして受け取ってもらえるか分からなかったため、文字列でNULLと入れてみたり、「\N」と入れてみたりと試してみました。 agunuzさんが言うように、すべて文字列となってしまうのであれば、CSVに文字列でNULLと入っていた場合には、実際のNULLに変換するなどして対応するのが良いでしょうか?

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

そもそも文字列カラムにNULLを指定する意味がないので ''(長さ0の文字)でよいような気がします。 場合によっては、「NULL」という文字列をデータ投入後 UPDATE テーブル SET カラム=NULL WHERE カラム='NULL' のような処理でもいいかもしれません。

non05410
質問者

お礼

回答頂きありがとうございました。 DB内でカラムによっては空文字列とNULLを使い分けている部分があったので、NULLはNULL、空文字は空文字として一応分けておきたいとい考えておりました。 今回はDB登録の前にNULLを変換するという形を取りましたが、yambejpさんの記述して頂いた内容も、今後参考にさせて頂きます。 ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

fgetcsvで得たデータをどうやってSQLに渡そうとしていますか?

non05410
質問者

補足

フレームワークに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でファイルを取得した際にはすでに文字列となっているようです。

関連するQ&A

  • 【PHP】""のないCSVを fgetcsv() で読む方法は?

    PHP5使用者です。 CSVを fgetcsv() で読み込みたいのですが初めてのためうまくいきません。対象のCSVは囲み文字の""がありません。 日本語が含まれているため""がないせいで読み込み後、文字化けを起こしています。 専門書によると fgetcsv($fp, 読み込み長さ, 区切り文字, 囲み文字) らしいのですが、囲み文字なしのCSVはどうするかは書いていません。 そもそもfgetcsv()で囲み文字のないCSVを読むこと自体無理なのでしょうか? お詳しい方、よろしくお願いいたします。

    • 締切済み
    • PHP
  • CSV読込(fgetcsv関数)で「手」が出ない…

    1マスに「手」と書いたCSV(文字コードSJIS)を fgetcsv関数(PHPファイルはEUC-JP)で取得し、 取得情報を1行づつ mb_convert_encoding($data, "EUC-JP", "SJIS"); でエンコーディングしたのですが、「手」だけを書いたマスのみ読込めません。 他の文字を書いたマスは正しく読込まれています。 こういう事象に陥った方おられませんでしょうか? また解決策をご存知の方がおられましたらご教授頂けないでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • CSVからNULL値をインポート

    phpMyAdminを使用してcsvからデータをインポートしようとしています。 通常の値は問題なくインポートできるのですが、NULL値があるフィールドがどうしても「0」になってしまいます。(そのフィールドはNULL値が入力可で、デフォルト値もNULLです) csvからNULL値をインポートする方法をご教授下さい。 宜しくお願いします。 ※\Nを入力するとNULLになるという情報があったため、 "1";"2";"3";"4";\N "1";"2";"3";"4";"\N" (1.2.3.4は適当な文字で、5番目をNULLにしたい) の両方を試みましたが、入力結果は「0」でした。 phpMyAdmin - 2.10.2 MySQL クライアントのバージョン: 5.0.18 フィールド区切り記号 ; フィールド囲み記号 ""

    • ベストアンサー
    • MySQL
  • csvファイルの読み込み

    このカテゴリを"csv"で検索してみましたが、同じような質問がなかったので、質問します! phpのfgetcsv()関数がありますが、 これって、日本語が混じるcsvでも問題なく動作しますでしょうか。 例えば、郵便番号CSVをfgetcsv()でとりこんでみたら、12万件中数十件で読み取りを間違えてました。(カンマで区切らずに一部つなげて読んでいる) 自分でcsvを解析する関数を作らないといけないのか、fgetcsv()でもうまく動かせるものなのか思案しています。 似たようなことで困ってる方、解決された方いらっしゃいますでしょうか。 よろしくお願いしいます。

    • 締切済み
    • PHP
  • PHP5でCSVの指定行データだけを取得するには?

    PHP初心者です。 下記のような方法で全てのデータを取得する方法があると知りました。 $fp = fopen("url.csv", "r"); while ($data = fgetcsv($fp, 1)) { foreach ($data as $d) { print $d . "<br>\n"; } } しかし指定行、例えば10行目等だけを取得する方法がわかりません。 CSVは1列で1000行ほどあります。 恐れ入りますが具体的なソースを教えてくださいませ。

    • ベストアンサー
    • PHP
  • csvをDBへ読み込んだら、NULLが勝手に0に

    csvファイルをMySQLへ読み込んだら、空白のところが勝手に0に置き換わってしまいました。 置き換わったカラムの型が、全部INTだったので、 試しにVARCHARへ変え、再度、取り込み処理を実施してみたところ、 希望通りに(空白のところは空白のままで)無事データを取り込むことが出来ました。 ■質問1 考えられる原因としては、DBの設定? それとも、PHP側の書き方でしょうか? ■質問2 データ型を決める際、数字はINT、文字列はVARCHAR、ぐらいの認識しかないのですが、 今回のように、INT型のカラムを、VARCHAR型に、変えたりすると、 起こり得るリスクとしては、どのようなものが考えられでしょうか? ■質問3 DBのデータ型が、「INT」と「VARCHAR」では、PHP側の書き方も変わってくるのでしょうか? □PHPの内容 ▽まず、UTF-8形式で上書き exec("nkf -w --overwrite data.csv"); ▽接続後読み込み $sql = "LOAD DATA LOCAL INFILE '$file' INTO TABLE `読み込むテーブルの名前` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\' LINES TERMINATED BY '\\r\\n'";

    • ベストアンサー
    • PHP
  • DB2 の SQL で NULL値を空文字として取得したい。

    2つのテーブルをLEFT OUTER JOIN等によって結合した場合、値がNULLになるカラムが出てくる事がよくあります。 この場合、取得する値をnullではなく空文字(長さ0の文字列)として取得する事は可能でしょうか? IS NULL関数やNVS関数など、他のDBMSで使えた方法がエラーとしてはじかれてしまいました。何か特別なコマンドがあるのかも知れませんが、手元のマニュアルにありません。オンラインマニュアルなどがあればいいのですが、今の所見つかっていません。 どなたかご存知でしたら、教えて頂けないでしょうか。

  • NULLの挿入の仕方が…?

    初心者です。 フォームからPHPでMySQLに値を挿入したいのですが、 NULLの挿入の仕方がわかりません。 一応、’’で空文字を登録できるようにはしているのですが、NULLとは別物になるんですよね? また、ネットで探してみたところ、\Nでいけると書いているところもあったような…しかし、\Nでは「N」が登録されてしまいます… 挿入方法を教えてください。お願いします。

    • ベストアンサー
    • MySQL
  • CSVファイルを読み込み表示すると行頭がおかしくなります

    ・CSVファイルを読み込み表示すると行頭がおかしくなります。 -【 CSVファイル(test.csv) 】------------------- 1,単一,必須 2,…,… ----------------------------------------- ・例えば上記のCSVを読み込んで、  PHPで表示すると以下のように表示されます。 -【 ブラウザ表示 】-------------------------- 1 P一 K須 2 … ----------------------------------------- ・というように最初の文字が正常に表示されません。 ・ちなみに数字(半角?)はちゃんと表示されました。 ・プログラムは下のような感じになります。 ・どこを編集すればよいでしょうか? -【 PHP 】--------------------------------- <?php  if( $fp = fopen( 'test.csv', 'r' ) ){   $data = fgetcsv( $fp );   while( ( $data = fgetcsv( $fp ) ) !== FALSE ){    echo $data[0] . ' ' . $data[1] . ' ' . $data[2] . '<BR>';   }  } ?> ----------------------------------------- -【 仕様 】--------------------------------- [OS]: CentOS5 [Server]: Apache_2.2.10 [PHP]: PHP_5.2.6 -----------------------------------------

    • ベストアンサー
    • PHP
  • CSV出力時の”0”表示(電話番号等)について

    PHPでDBのカラムから配列で取得したデータをcsv出力しダウンロードさせるプログラムを作成しています。 csv形式でのダウンロードは完了していますが、電話番号などの頭に’0’が入る文字列は’0’が消えてしまいます。(例:03→3) ダウンロードしたcsvをエディタで開くと’0’は表示されます。 この場合、どのような制御をPHP側ですればいいいでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう