7

curl を作成して URL にアクセスし、その結果をファイル リソースとして出力することはできますか? fopenがどのようにそれを行うかのように。

私の目標:

  1. CSV ファイルを解析する
  2. fgetcsvに渡す

私の障害: fopen が無効になっています

私のコードの塊(fopen内)

$url = "http://download.finance.yahoo.com/d/quotes.csv?s=USDEUR=X&f=sl1d1t1n&e=.csv";
$f = fopen($url, 'r');
print_r(fgetcsv($f));

次に、カールでこれを試しています。

$curl = curl_init();
curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
curl_setopt($curl, CURLOPT_URL, $url);
$content = @curl_exec($curl);
curl_close($curl);

でも、いつも通り。$content はすでに文字列を返しています。

さて、curl がそれをファイル リソース ポインタとして返すことは可能ですか? fopenのように?PHP < 5.1.x を使用しています。つまり、str_getcsv は 5.3 しかないので使用していません。

私のエラー

警告: fgetcsv() は、パラメーター 1 がリソースであると想定しています。ブール値が指定されています

ありがとう

4

2 に答える 2

11

あなたが「無効になっている」fopen is disabledという意味であると仮定すると、これを組み合わせて、これをかなり簡単にします。allow_url_fopenCURLOPT_FILEphp://temp

$f = fopen('php://temp', 'w+');

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FILE, $f);
// Do you need these? Your fopen() method isn't a post request
// curl_setopt($curl, CURLOPT_POST, true);
// curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
curl_exec($curl);
curl_close($curl);

rewind($f);

while ($line = fgetcsv($f)) {
  print_r($line);
}

fclose($f);

基本的に、これは「仮想」ファイルへのポインタを作成し、cURLはその中に応答を保存します。次に、ポインタを最初にリセットするだけで、通常どおりにポインタを開いたかのように扱うことができます。fopen($url, 'r');

于 2012-08-08T15:30:56.727 に答える
0

を使用して一時ファイルを作成し、その内容を作成できfopen()ますfwrite()。その後、新しく作成されたファイルはfgetcsv(). このtempnam()関数は、任意の一時ファイルの作成を処理する必要があります。

のコメントによるとstr_getcsv()、コマンドにアクセスできないユーザーは、以下の機能を試すことができます。コメントには他にもさまざまなアプローチがあります。それらを確認してください。

function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') {
    if (is_string($input) && !empty($input)) {
        $output = array();
        $tmp    = preg_split("/".$eol."/",$input);
        if (is_array($tmp) && !empty($tmp)) {
            while (list($line_num, $line) = each($tmp)) {
                if (preg_match("/".$escape.$enclosure."/",$line)) {
                    while ($strlen = strlen($line)) {
                        $pos_delimiter       = strpos($line,$delimiter);
                        $pos_enclosure_start = strpos($line,$enclosure);
                        if (
                            is_int($pos_delimiter) && is_int($pos_enclosure_start)
                            && ($pos_enclosure_start < $pos_delimiter)
                            ) {
                            $enclosed_str = substr($line,1);
                            $pos_enclosure_end = strpos($enclosed_str,$enclosure);
                            $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
                            $output[$line_num][] = $enclosed_str;
                            $offset = $pos_enclosure_end+3;
                        } else {
                            if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
                                $output[$line_num][] = substr($line,0);
                                $offset = strlen($line);
                            } else {
                                $output[$line_num][] = substr($line,0,$pos_delimiter);
                                $offset = (
                                            !empty($pos_enclosure_start)
                                            && ($pos_enclosure_start < $pos_delimiter)
                                            )
                                            ?$pos_enclosure_start
                                            :$pos_delimiter+1;
                            }
                        }
                        $line = substr($line,$offset);
                    }
                } else {
                    $line = preg_split("/".$delimiter."/",$line);

                    /*
                     * Validating against pesky extra line breaks creating false rows.
                     */
                    if (is_array($line) && !empty($line[0])) {
                        $output[$line_num] = $line;
                    } 
                }
            }
            return $output;
        } else {
            return false;
        }
    } else {
        return false;
    }
}
于 2012-08-08T15:28:53.527 に答える