2

私のホスティング プロバイダーには str_getcsv() をサポートするバージョンの PHP がないため、いろいろ調べてこの関数を見つけました。それは私に余分な空の配列を与え、それが私のコードを台無しにしていることを除いて、トリックを行います. 例 "a, b, b" は を返しArray ( [0] => a [1] => b [2] => c [3] => )ます。関数は次のとおりです。

function _pick_csv_element($x) {
return strlen($x[1]) ? $x[1] : $x[2];
}

function str_getcsv($input) {
preg_match_all(
    '/\G (?: \s*"([^"]*)"\s* | ([^,]*) ) (?:,|$) /x',
    $input, $matches,
    PREG_SET_ORDER
);
return array_map('_pick_csv_element', $matches);
}
4

3 に答える 3

5

おそらく最も信頼できる回避策は次のとおりです。

$fh = fopen('php://temp', 'r+');
fwrite($fh, $string);
rewind($fh);

$row = fgetcsv($fh);

fclose($fh);

組み込みの CSV 関数を引き続き使用し、ストリームから読み取るようにするだけです。ただし、文字列をコピーする必要があるため、これにはわずかなパフォーマンス ヒットがあります。

于 2012-11-17T11:49:28.063 に答える
1

デイブ、

PHP 5.2.* を使用していると思います。CSV ファイル全体を多次元の連想配列に読み込む必要がある場合は、以下のようにするとうまくいきます。

function parse_csv_file($csvfile) {
    $csv = Array();
    $rowcount = 0;
    if (($handle = fopen($csvfile, "r")) !== FALSE) {
        $max_line_length = defined('MAX_LINE_LENGTH') ? MAX_LINE_LENGTH : 10000;
        $header = fgetcsv($handle, $max_line_length);
        $header_colcount = count($header);
        while (($row = fgetcsv($handle, $max_line_length)) !== FALSE) {
            $row_colcount = count($row);
            if ($row_colcount == $header_colcount) {
                $entry = array_combine($header, $row);
                $csv[] = $entry;
            }
            else {
                error_log("csvreader: Invalid number of columns at line " . ($rowcount + 2) . " (row " . ($rowcount + 1) . "). Expected=$header_colcount Got=$row_colcount");
                return null;
            }
            $rowcount++;
        }
        //echo "Totally $rowcount rows found\n";
        fclose($handle);
    }
    else {
        error_log("csvreader: Could not read CSV \"$csvfile\"");
        return null;
    }
    return $csv;
}
于 2013-04-24T05:46:00.347 に答える