また、プログラムを作ることにしました。
今回は、その一部分です。
CSVファイルのデータを、dbのmysqlに入れる部分です。
もしかして、これって大変かも?
そこで、ネットで調べてみました。
すると、phpには、CSV用の関数があるみたい。
また、この関数はよくできているようです。
ところでCSVファイルですが、,(コンマ)で区切る以外、決まりはないようです。
お~、なんと自由。
といいたいところですが、このいい加減のために困ることも。
そのため、いろいろな派生があるようです。
それでも、暗黙の了解みたいなものもあるみたいです。
今書いてあることは、いろいろなところを調べて書いています。
しかし、改めて調べて書くのは面倒なので、話半分で読んでください。
一番多かった決まりは、まずは、コンマで区切る。
ま~、これは当たり前か~
といいたいですが、CSVファイルなのに、区切り文字がタブってのもありました。
次に、データは”(ダブルクォーテーション)でくくる。
じゃあ、データの中にダブルクォーテーションを入れたい場合は?
その場合は、””とダブルクォーテーションをつづける。
おっと、ダブルクォーテーションの前に、コンマを入れたい場合は?
この疑問の方が先か~
この場合は、ダブルクォーテーションの間に入っている場合は、区切り文字とは扱われない。
そんなルールがあるようです。
さて、CSVファイルですが、普通はエクセルに関連づいています。
だから、CSVファイルのアイコンは、エクセルのアイコンに似ています。
CSVファイルをクリックすると、エクセルが起動します。
だんだん、今回の問題に近づいてきました。
もちろん、CSVファイルは、メモ帳でも開くことができます。
しかし、便利なので、エクセルでついついデータの入力等をしてしまいます。
今は、エクセルのファイルを開く方法を書きましたが、今度はCSVファイルを作るときです。
メモ帳で、せこせこと作ることはできます。
でも、エクセルでデータを入力して、保存するときに、ファイルの拡張子をCSVにして保存する方法が一般的ではないでしょうか。
この方法で作成したCSVファイルを、メモ帳で開いたとします。
すると、データの部分が、ダブルクォーテーションでくくられていません。
セルのデータに、ダブルクォーテーション、コンマ、改行が入っているセルのデータには、ダブルクォーテーションはついているようです。
もし、全部のデータに、ダブルクォーテーションが付いていたら、私は休日を優雅に過ごせたかも知れません。
しかし、このエクセルの独自ともいえるルールのために、後に困ることになりました。
ま~、別に、エクセル君がルールを破っているわけではありません。
データはちゃんとコンマで区切られています。
決まりは守っています。
あとは、暗黙?の部分のデータがダブルクォーテーションでくくられていないだけです。
でも、これは決まりではないので、守るかどうかは生き方(ポリシー)の問題です。
さて、エクセルでCSVのデータは、ダブルクォーテーションでくくりたいと思ったあなた。
マイクロソフトは、どう考えているでしょうか?
マイクロソフトのページには、そんな機能はない。
やりたかったら、マクロで出来ます。
見たいな事が書いてありました。
じゃ、そのマクロはどう作るの?
そのマクロを期待したのですが、さすがマイクロソフト君、書いていません。
その代わりに、逃げのような言葉が・・・
そこまで、言い訳するなら、例のプログラムぐらい書けよ(怒)
そのページソースを探したのですが、見つかりませんでした。
なんせ、仕事中に見つけたので、ブックマークを忘れました。
これも、話半分って事で。
ここで、エクセル君のお話は置いといて、プログラムの話です。
phpの関数のfgetcsvですが、CSVのファイルに改行が入っていても、ちゃんと判断してくれるようです。
そのはずなんだが・・・
プログラムを作り、テストしました。
すると、文字化けが。
最初の一文字が化けています。
商品の商の文字が、ちゃんと表示されません。
ま~、いまさら、文字化けなどで、驚きません。
初めて、DBのmysqlで経験済みです。
すかさず、ネットで検索。
すると、php5で、fgetcsvの仕様が変わったようです。
なんか、ローケルがどうしたこうした。
ローケル?ローカルじゃねーの?
そう思いながら、さらに検索。
すると、
setlocale(LC_ALL, 'ja_JP.');
って入れると、幸せになるそうです。
私も幸せになりたい。
しかし、幸せになれませんでした。
まだ、文字化けしています。
この時点では、まだまだ余裕でした。
だって、CSVで、DBにデータ入力のなんて、今では普通の事です。
特殊ではないということは、みんなやっているということです。
楽天や、ヤフーの商品登録では、CSVでやる方法があるくらいです。
さらに検索。
すると、5cなる文字がちらほら・・・
さて、パソコンの文字表示ですが、いろいろな文字コードってのがあります。
shift-jis,euc,utf-8などです。
この辺の説明は、面倒なので、自分で調べてください。
エクセルでCSVファイルを作成すると、shift-jisで保存されるようです。
というより、エクセルはshift-jisしか出来ないみたいです。
もし、文字コードが、eucのcsvファイルを開くと文字化けが・・・
ほかの文字コードも使えると、もっと幸せになるのですが。
なんやら、fgetcsvの関数の話なのに、エクセルや文字コードが出てきて、なに?と疑問符がちらついていると思います。
まとまりがなくなってきたので、核心部分へ。
phpのfgetcsvの関数は、shift-jisファイルは、ちゃんと処理が出来ません。
まったくだめかというと、データがダブルクォーテーションでくくられていると、処理できるようです。
もし、ダブルクォーテーションがなくても、文字コードが、utf-8なら問題がないようです。
なら、データをダブルクォーテーションでくくれば、問題解決。
しかし、今回作るプログラムに入れるデータは、すでに膨大にあります。
いまさら、データを変更できないよ~
では、文字コードを変更すれば?
でも、ボロサーバーの関係や、諸事情から文字コードはeucでしなければなりません。
だめだ・・・
それでも、世の中は広い。
誰かが、解決方法を見つけているはず。
祈る気持ちで、検索しました。
なかなか、思ったのが見つかりません。
これで、休日が消えました。
もうだめだ。
そこで、いくつか見つけたのを試してみました。
一番見つかったのが、このページです。
今回の件で調べると、このページにあるコードで、幸せになれたってのが多かったです。
でも、私は、幸せになれませんでした。
やはり、文字化けします。
う~ん、やり方が間違っているのだろうか?
使用例もあるみたいなので、それもコピペ。
試してみると、ちゃんと表示されました。
でも、問題が、表示されている文字コードを調べると、UTF-8でした。
そこで、EUCになるようにコードを変更。
すると、やっぱり文字化け。
そこで、違うのを探すことにしました。
すでに、この時点で、日付は変わっています。
で、いろいろ試した結果、このページです。
現時点では、大丈夫みたいです。
両方のページも、いったんCSVのデータを読み込み、正規表現でぶった切っているようです。
私も、むかし、正規表現を勉強したのですが、忘れました。
そのため、このコードがよくわかりません。
だから、そのまま使うのは、ちょっと不安。
それでも、面倒になってきたので、とりあえず採用。
それより、phpで、fgetcsvの関数をなんとかしてくれよ~
そういえば、php5でこの関数が直るって情報がありました。
すでに、php5なのに、あれってガセ?
今度のphp6に期待したいです。
でも、今度のphp6では、何度も苦しめられたセーフモードが廃止されるようです。
php4から、php5になるとき、かなり変化がありました。
このときも、結構戸惑いました。
また、同じ苦労をしなければならないのでしょうか?
がんばって乗り越えるつもりですが、それなりのご褒美も用意してほしいです。
あれほど好きだったphpが、ちょっと嫌いになりそうです。
コメント