<?php
// csvmerge
require 'vendor/autoload.php';

use League\Csv\Writer;

// 対象ディレクトリ指定（末尾/）
define('DIR', './data/');

// 対象ディレクトリよりファイル一覧取得
$files = [];
if ($handle = opendir(DIR)) {

    while (false !== ($entry = readdir($handle))) {
        if (!in_array($entry, ['.', '..'])) {
            $files[] = $entry;
        }
var_dump($entry);
    }
    closedir($handle);
}

if (!isset($_POST['do'])) {
    echo "<h3>CSVマージ</h3>\n";
    echo "以下のCSVファイルをマージします。<ul>";
    foreach ($files as $file) {
        echo "<li>".DIR."{$file}</li>\n";
    }
    echo "</ul>";
    echo '<form action="./'.basename(__FILE__).'" method="post"><input type="submit" value="実行"><input type="hidden" name="do" value="1"></form>';
    exit;
}

// ファイル一覧でループ
$values = [];
foreach ($files as $file) {
    $values = array_merge($values, parse_csv($file));
}

// マージした配列を出力
$labels = [ 'CODE', 'NAME', 'GROUPING', 'CATEGORY1', 'CATEGORY2', 'URL', 'IMG', 'IMG2', 'TEXT', 'TEXT2', 'TEXT3', '表示フラグ', '開始日時', '終了日時' ];
$csv = Writer::createFromFileObject(new \SplTempFileObject());

$csv->setOutputBOM(Writer::BOM_UTF8);
$csv->insertOne($labels);
$csv->insertAll($values);
$csv->output("merged-".date("YmdHis").".csv");

// CSVファイルを読み込み適切に処理して返す
function parse_csv($file) {

    // CSV読み込み
    $lines = readCsv(DIR.$file);

    $data = $keys = [];
    foreach ($lines as $line) {

        // 共通処理
        // 表示フラグ置換
        $line[11] = ($line[11] == 'T') ? '1' : '0';

        // ファイル別処理
        switch ($file) {
            case 'fund_pre_master.txt':
                // Rtoaster.itemの値を抽出
                if (preg_match('/Rtoaster.item\("(.*)_(.*)_(.*)"\);/', $line[0], $matches)) {
                    $line[0] = sprintf("%s_%s_%s", $matches[1], $matches[2], $matches[3]);
                    if (!in_array($line[0], $keys)) {
                        $data[] = $line;
                        $keys[] = $line[0];
                    }
                    $line[0] = sprintf("fund_%s", substr($matches[3], -8));
                    if (!in_array($line[0], $keys)) {
                        $data[] = $line;
                        $keys[] = $line[0];
                    }
                }
                continue;
            
            case 'mydirect_pre_master.txt':
                // IMG列を置換
                $line[6] = getLastVal($line[6]);
                // TEXT列を置換
                $line[8] = getLastVal($line[8]);
            break;
        }
        if (!in_array($line[0], $keys)) {
            $data[] = $line;
            $keys[] = $line[0];
        }
    }

    return $data;
}

function readCsv($filePath) {

    // CSV読み込み
    $file = new SplFileObject($filePath); 
    $file->setFlags(SplFileObject::READ_CSV
    | SplFileObject::READ_AHEAD // 先読み/巻き戻しで読み出します。
    | SplFileObject::SKIP_EMPTY // ファイルの空行を読み飛ばします。(READ_AHEAD フラグ有効時)
    );

    $lines = [];
    $codes = '';
    foreach ($file as $line) {
            
        // BOMを除去
        $line = preg_replace("/^\xef\xbb\xbf/", '', $line);
   
        // 空のレコードは無視
        if (!empty($line) && $line[0]) {

            // コードバッファにプール
            if (count($line) == 1) {
                $codes .= $line[0];
                continue;
            }

            // コードバッファを連結
            if ($codes) {
                $line[0] = $codes . $line[0];
                $codes = '';
            }
            $lines[] = $line;
        }
    }

    // 文字コードをコンバートする。
    //mb_convert_variables('UTF-8', 'MS932,SJIS-win,SJIS', $csvList);

    return $lines;
}

function getLastVal($buf)
{
    $ex = explode('<>', $buf);
    // 配列末尾から値を抽出
    while ($val = array_pop($ex)) {
        if ($val) {
            return $val;
        }
    }
    return false;
}
