7

我似乎在使用 Quercus 在 Google App Engine 上使用 PHP 开发的一个小应用程序处于第 22 阶段;

  1. 我有一个远程 csv 文件,可以下载并存储在字符串中
  2. 要解析该字符串,我最好使用 str_getcsv,但 Quercus 还没有该功能
  3. Quercus 似乎确实知道 fgetcsv,但该函数需要一个我没有的文件句柄(而且我不能创建一个新句柄,因为 GAE 不允许创建文件)

任何人都知道如何解决这个问题,而不必关闭内置的 PHP csv-parser 函数并编写我自己的解析器?

4

5 回答 5

1

我认为最简单的解决方案确实是编写自己的解析器。无论如何,这都是小菜一碟,会让你学习更多的正则表达式——在 PHP 中没有用于数组解析器的 csv 字符串是没有意义的,所以完全有理由编写你自己的。只要确保它不会太慢;)

于 2011-09-22T09:05:59.440 回答
0

您也许可以使用stream_wrapper_register创建一个新的流包装器。

这是手册中读取全局变量的示例:http ://www.php.net/manual/en/stream.streamwrapper.example-1.php

然后,您可以像使用普通文件句柄一样使用它:

$csvStr = '...';
$fp = fopen('var://csvStr', 'r+');
while ($row = fgetcsv($fp)) {
    // ...
}
fclose($fp);
于 2011-08-18T00:45:35.210 回答
0

这显示了一个简单的手动解析器,我使用带有限定、非限定、转义功能的示例输入编写。它可用于标题和数据行,并包含一个 assoc 数组函数,可将您的数据转换为 kvp 样式数组。

//example data
$fields = strparser('"first","second","third","fourth","fifth","sixth","seventh"');
print_r(makeAssocArray($fields, strparser('"asdf","bla\"1","bl,ah2","bl,ah\"3",123,34.234,"k;jsdfj ;alsjf;"')));


//do something like this
$fields = strparser(<csvfirstline>);
foreach ($lines as $line)
    $data = makeAssocArray($fields, strparser($line));


function strparser($string, $div = ",", $qual = "\"", $esc = "\\") {
    $buff = "";
    $data = array();
    $isQual = false; //the result will be a qualifier
    $inQual = false; //currently parseing inside qualifier

    //itereate through string each byte
    for ($i = 0; $i < strlen($string); $i++) {
        switch ($string[$i]) {
            case $esc:
                //add next byte to buffer and skip it
                $buff .= $string[$i+1];
                $i++;
                break;
            case $qual:
                //see if this is escaped qualifier
                if (!$inQual) {
                    $isQual = true;
                    $inQual = true;
                    break;
                } else {
                    $inQual = false; //done parseing qualifier
                    break;
                }
            case $div:
                if (!$inQual) {
                    $data[] = $buff;    //add value to data
                    $buff = "";         //reset buffer
                    break;
                }
            default:
                $buff .= $string[$i];
        }
    }
    //get last item as it doesnt have a divider
    $data[] = $buff;
    return $data;
}

function makeAssocArray($fields, $data) {
    foreach ($fields as $key => $field)
        $array[$field] = $data[$key];
    return $array;
}
于 2011-09-21T06:27:13.177 回答
0

如果它可能又脏又快。我只会使用 http://php.net/manual/en/function.exec.php 将其传入并使用 sed 和 awk (http://shop.oreilly.com/product/9781565922259.do) 进行解析它。我知道你想使用 php 解析器。我以前尝试过但失败了,只是因为它没有说出它的错误。希望这可以帮助。祝你好运。

于 2011-11-03T17:22:56.230 回答
0

您也许可以使用fopenwith php://tempor php://memory( php.net ) 来让它工作。你要做的就是打开php://temp或者php://memory,写入它,然后倒带它(php.net),然后将它传递给 fgetcsv。我没有对此进行测试,但它可能会起作用。

于 2011-11-07T20:52:11.553 回答