私の休みを返して!phpのfgetcsvの関数で悩んだよ

スポンサーリンク

また、プログラムを作ることにしました。

今回は、その一部分です。

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でしなければなりません。

だめだ・・・

それでも、世の中は広い。

誰かが、解決方法を見つけているはず。

祈る気持ちで、検索しました。

なかなか、思ったのが見つかりません。

これで、休日が消えました。

もうだめだ。

そこで、いくつか見つけたのを試してみました。

一番見つかったのが、このページです。

PHP5でfgetcsvが正常に動作しない

今回の件で調べると、このページにあるコードで、幸せになれたってのが多かったです。

でも、私は、幸せになれませんでした。

やはり、文字化けします。

う~ん、やり方が間違っているのだろうか?

使用例もあるみたいなので、それもコピペ。

試してみると、ちゃんと表示されました。

でも、問題が、表示されている文字コードを調べると、UTF-8でした。

そこで、EUCになるようにコードを変更。

すると、やっぱり文字化け。

そこで、違うのを探すことにしました。

すでに、この時点で、日付は変わっています。

で、いろいろ試した結果、このページです。

fgetcsv の代替関数

現時点では、大丈夫みたいです。

両方のページも、いったんCSVのデータを読み込み、正規表現でぶった切っているようです。

私も、むかし、正規表現を勉強したのですが、忘れました。

そのため、このコードがよくわかりません。

だから、そのまま使うのは、ちょっと不安。

それでも、面倒になってきたので、とりあえず採用。

それより、phpで、fgetcsvの関数をなんとかしてくれよ~

そういえば、php5でこの関数が直るって情報がありました。

すでに、php5なのに、あれってガセ?

今度のphp6に期待したいです。

でも、今度のphp6では、何度も苦しめられたセーフモードが廃止されるようです。

php4から、php5になるとき、かなり変化がありました。

このときも、結構戸惑いました。

また、同じ苦労をしなければならないのでしょうか?

がんばって乗り越えるつもりですが、それなりのご褒美も用意してほしいです。

あれほど好きだったphpが、ちょっと嫌いになりそうです。

コメント

タイトルとURLをコピーしました