ここは、技術情報、身の回りに起こった出来事を、「もしかしたらみんなの役に立つかもしれない」と思って書き留めておく場所です。

Image

Shift JISのCSVをWordPressにインポート

2012年9月21日
 

他のDBからWordPressにデータをインポートしようとしたのですが、データ加工が必要でした。

そのため、DBからデータをCSVにエクスポートし、Excelで加工しました。

その後、WordPressに加工したCSVをインポートしようとしました。

 

プラグインでインポート

CSVにインポートするプラグインはCSV Importerのようですが、どうやら文字コードをUTF-8にする必要があるようです。

Excelで操作できるCSVはShift JISですし、環境によって文字化けする場合があるようです。

とすると、プラグインをカスタマイズする必要がありそうですね。

 

CSV Importerをカスタマイズ

入力のCSVがSJISのため、内部でUTF-8に変換するといった処理となるはずです。

 

調べた結果、PHP自体のCSVをパースする関数に、制限があるようでした。

PHP5 の fgetcsv() で読み込み内容が腐る現象

PHPでメモリ上に一時ファイルを作る

※上記2サイトは大変参考になりました。

ということで、CSV ImporterのFile_CSV_DataSource/DataSource.phpparse()を以下のように修正します。

 

/**
* csv parser
*
* reads csv data and transforms it into php-data
*
* @access protected
* @return boolean
*/
protected function parse()
{
    if (!$this->validates()) {
        return false;
    }
    $buf = mb_convert_encoding(file_get_contents($this->_filename), 'UTF-8', 'sjis-win');
    $res = tmpfile();
    fwrite($res, $buf);
    unset($buf); // 一応
    rewind($res);
    $current_locale = setlocale(LC_ALL, '0'); // 現在のロケールを取得
    setlocale(LC_ALL, 'ja_JP.UTF-8');
    /* $c = 0; やめます */
    $d = $this->settings['delimiter'];
    $e = $this->settings['escape'];
    $l = $this->settings['length'];

    /* $res = fopen($this->_filename, 'r'); */

    while ($keys = fgetcsv($res, $l, $d, $e)) {
        $this->rows[] = $keys;
        /* if ($c == 0) {
        $this->headers = $keys;
        } else {
        array_push($this->rows, $keys);
        }

        $c ++; */
    }
    if (count($this->rows) > 0) {
        $this->headers = array_shift($this->rows); // ループの外に出す
    }
    setlocale(LC_ALL, $current_locale); // ロケールを戻す
    fclose($res);
    $this->removeEmpty();
    return true;
}

 

参考にした2サイトの処理を考慮しつつ改造しました。

アップロードされたファイルをsjis-winからUTF-8に変換し、一時ファイルを作ります。

ロケールを念のため取得して戻しています。

ループ の中で1回だけの判定のような処理はループ外に出します。

一応基本的な動作とカスタムフィールドのインポートも大丈夫でした。