phpでCSVフォーマットに落とし込む
大量の商品データをEC-CUBEへ登録する方法の一つとして、CSV登録機能があります。
しかし、EC-CUBEのバージョンを上げるなどする際に、古いバージョンのCSVを新しいバージョンのEC-CUBEへ登録ができなかったりします。
原因はフォーマットの違いや、商品ID等を空欄にしていないためです。
その場合はCSVファイルをエクセルで開き、ひとつひとつ手で修正していかなければなりません。
数が少なければそれでも良いのですが、1,000件ほどあるような場合はとても大変です。
そこでプログラムで、旧フォーマットCSVを新フォーマットCSVに変換する方法が有用になります。
やることはファイルリードとファイルライトですがCSVは少し面倒
処理としては、旧CSVファイルを読み込み、新CSVファイルに出力するだけのことです。
プログラマーをされている方ならば、初歩の課題や、参考書の例題として出ているような内容で組むことができる程度の内容です。
簡単簡単と思ってやってみたら、fgets関数は改行ごとに1行として処理されるため、CSVファイルの1行の判断ができないことがわかりました。(EC-CUBEの商品コメント欄に改行が含まれていると、そこで行が区切られる現象が発生)
データを一括で読んで、カンマを一つ一つ判断していかなければならないのか?
とも思いましたが、そこは優れた関数が用意されていました。
fgetcsv 関数は1行に改行が複数混ざっていても、CSVの1行を1行として認識しながら、カンマごとに配列に落とし込んでくれます。
fgetcsv関数でCSVファイルの読み込みはうまくできるようになりました。
次はCSVのファイル出力
読み込みできたのだからあとは出力するだけです。
fgetcsvで読み込んだデータは配列になっているので、配列をそのままファイルに出力できるfile_put_contents関数を使用して出力してみました。
出力したCSVファイルを見てみると、元のCSVファイルと同じように出力・・・・されていない!?
文章とか、改行とか同じように出力されていましたが、何か違和感が・・・。
CSV区切り文字のカンマが出力されていませんでした。
もしかしたら、fwrite関数でひとつずつカンマを足しながら出力しなければならないのか?
とも思いましたが、もしかしたらCSV専用の出力関数があるのではないかと思い調べたらありました。
fputcsv関数が配列をCSVフォーマットに変換してファイル出力してくれる優れものでした。
fgetcsvで読み込んだデータをそのままfputcsvで出力すると、元CSVファイルをそっくりそのまま複製することができました。
あとは、必要に応じて変換するだけ
入力と出力が用意できたのなら、あとは簡単です。
CSV1行分のデータがfgetcsvにより配列になっているのだから、位置の組み換えや、特定項目の空欄化は容易に編集できます。
CSVファイルの手動変換作業が困難な場合は、プログラムによる自動変換処理を組んでみるのも一つの方法です。