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

または(php.netfopen )を使用して機能させることができる場合があります。またはを開き、書き込み、巻き戻し(php.net)して、fgetcsvに渡します。私はこれをテストしませんでしたが、うまくいくかもしれません。php://tempphp://memoryphp://tempphp://memory

于 2011-11-07T20:52:11.553 に答える
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

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

これは、修飾された、修飾されていない、エスケープ機能を備えた入力例を使用して作成した単純な手動パーサーを示しています。ヘッダーとデータ行に使用でき、連想配列関数を含めてデータを 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 に答える