【PHP】Excel等のTSV形式のコードと値の設定をPHPの配列に変換するスクリプト

  • 2023年10月4日
  • PHP

 しばしばExcelファイルなどのTSVにしやすい形式で設定値等を得ることがあります。この設定値をPHP内で使う時、特にLaravelで使う時などは配列形式にすることが多いです。この変換処理を行うPHPスクリプトを紹介します。

 紹介するスクリプトは、SV形式のデータ(例:ExcelやGoogleスプレッドシートからエクスポートされたもの)を読み取り、それをPHPの設定ファイルとして出力します。TSVデータは次の形式を想定しています。

code1	名称1
code2	名称2

 もしコードと名称が逆なら array_flip で対処できます。

 実際のコードと使用例が次です。

<?php
/*
 * TSV を元に、コードと名称の配列PHPを作成する
 */

/**
 * TSV文字列を元に、コードと名称のPHP配列ファイルを出力する
 *
 * @param string $tsv  TSV形式の文字列
 * @param string $dist 出力先のファイルパス
 */
function dumpTsv2PhpArr(string $tsv, string $dist): void {
    // 改行でTSV文字列を行毎に分割
    $lines = explode("\n", $tsv);

    // 空の行を削除
    $lines = array_filter($lines, function($line) {
        return !empty($line);
    });

    // 各行をタブで分割して、コードと名称を取得
    $lines = array_map(function($line) {
        return explode("\t", $line);
    }, $lines);

    // キーとして'code'と'name'を持つ連想配列に変換
    $lines = array_map(function($line) {
        return [
            'code' => $line[0],
            'name' => $line[1],
        ];
    }, $lines);

    // PHPの連想配列の形式にフォーマット
    $lines = array_map(function($line) {
        return sprintf("    '%s' => '%s'", $line['code'], $line['name']);
    }, $lines);

    // 配列の要素を連結
    $lines = implode(",\n", $lines);

    // PHPの配列の形式で文字列を構築
    $lines = "<?php\nreturn [\n".$lines."\n];";

    // ファイルに書き込み
    file_put_contents($dist, $lines);
}

/**
 * TSVファイルを元に、コードと名称のPHP配列ファイルを出力する
 *
 * @param string $filePath TSVファイルのパス
 * @param string $dist     出力先のファイルパス
 */
function dumpTsv2PhpArrFromFile(string $filePath, string $dist): void {
    // TSVファイルを読み込み
    $tsv = file_get_contents($filePath);

    // TSV内容を元にPHP配列ファイルを出力
    dumpTsv2PhpArr($tsv, $dist);
}

// 使用例: サンプルとして'tmp.tsv'ファイルを読み、'country_code.php'に変換して保存
dumpTsv2PhpArrFromFile(__DIR__.'/tmp.tsv', __DIR__.'/config/const/country_code.php');

 それほど出番があるわけではありませんがコピペと手打ちによる加工をするよりはずっと楽になります。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG