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 回答
-1

在这里寻找您的答案,这可能对您有很大帮助。

替代 str_getcsv

于 2013-05-13T09:33:22.313 回答