4

fgetcsv() でコンマ区切り値ファイルを読み取ろうとしています。通常、これは期待どおりに機能しますが、一部の列が 1 つとして扱われるのではなく、新しいデータ行に分割されているファイルに遭遇しました。

問題を引き起こす行の例を次に示します: pastie.org/5664800

問題を引き起こしている列は、説明を構成する複数の行を持つ列です。

fgetcsv は、次の行に到達すると最初の読み取りを終了します。

- Length/Width/Height: 3.75\""x2.4\""x2.4\"" (95.25X60.96x60.96) 

たとえば、コードがある場合:

ini_set('auto_detect_line_endings', true);

while ($row = fgetcsv($filepointer, 5000, ',', '"') {
    echo '<pre>'; var_dump($row); echo '</pre><br />';
}

" " で終わるほぼ完全なデータ行を 1 つ取得しLength/Width/Height: 3.75\"x2.4\""x2.4\"" (95.25X60.96x60.96)、その後のすべての改行は最後まで独自の行として扱われます。

ここで何が起こっているのか分かりますか?

4

2 に答える 2

5

問題は、データに文字シーケンスが含まれていること\""です。コンテキストから、これがリテラル substring を表すことになっていることは明らか\"です。つまり、ブラックスラッシュは文字通りのバックスラッシュであると想定されていますが、二重引用符は二重にすることでエスケープされています。

ただし、デフォルトでは、fgetcsv()はバックスラッシュをエスケープ文字として扱うため、文字をバックスラッシュでエスケープされたリテラル二重引用符として解析し、2 番目が二重引用符で囲まれた文字列を終了する\"と想定します。"

PHP 5.3.0 以降を使用している限り、修正は簡単です。5fgetcsv()番目のパラメーターとして他の文字を渡すことにより、バックスラッシュをエスケープ文字として扱わないように指示するだけです。どうやらnullorfalseまたは''を渡してもエスケープ文字を完全に無効にすることはできませんが、'"'(つまり、引用符と同じ値を)渡すと次のようになります。

while ( $row = fgetcsv( $filepointer, 0, ',', '"', '"' ) ) {
    var_export( $row );
    echo "\n";
}
于 2013-01-11T00:39:33.627 に答える
0

fgetcsv()の5番目の引数は、囲まれた文字列内にある場合に「囲み文字」をエスケープする方法です。

于 2013-01-10T21:19:37.533 に答える