3

fgetcsv()ドキュメントに関しては、fgetcsv()関数内にいくつかのパラメーターがあります:ハンドル、長さ、区切り文字、エンクロージャー、およびエスケープ。

今、私は2つの質問があります:

  1. エンクロージャーは正確に何をしますか?
  2. 1行に5列のcsvファイルがあります。次のように想像してみてください:1、2、3、4、5

したがって、インデックスは0〜4です。ただし、インデックス4から日付を取得する場合は常に、空の値が返されます。その後にコンマを入れない限り(1、2、3、4、5、6のような内容になる追加の列を後に入力することによって)。この問題を解決するにはどうすればよいですか?csvファイルの各行の最後の項目の後にカンマがないため、問題があるようです。

4

3 に答える 3

6

 1.enclosureパラメータは、特定のフィールドまたは「インデックス」のデータをカプセル化する文字です。デフォルトでは、パラメータはです"。これは、文字列を文字で「囲む」ことができることを意味します"

例:

1,2,"this is three",4


 2.コメントごとに、あなたは呼んでいますfgetcsv($handle, 10000, ',')。おそらく、あなたが読んでいる行が10000文字より長い可能性があります。長さをに変更してみてください0。これは「制限なし」になり、それが役立つかどうかを確認します。別の解決策は、列の値を二重引用符で囲むことです。

于 2012-08-22T14:33:17.883 に答える
2

エンクロージャーは、フィールドを囲む文字です。これは、ある種の追加の区切り文字です。

たとえば、フィールド区切り文字hello,worldとしてコンマがあり、テキスト区切り文字がありませんが、テキスト区切り文字として引用符があります。一部のシステムでは、区切り値と区切りなしの値を使用して、それぞれテキストフィールドと数値フィールドを示します(Microsoft Excelではそうだと思います)。これにより、フィールドの値にフィールド区切り文字を含めることができます。"hello","world"

"Hello,world","Second Field","Third, and last, field".

他の一部のシステムは、フィールド区切り文字を含む値、または空白を含む値のみを囲みます。つまり、これらのシステムでは、区切られていない値は必ずしも数値ではありません

「些細な」ケース(値の中にエスケープされたフィールド区切り文字がない、区切られていない値(つまり、'A、firstpartB \、secondpartB、C'のものがない))がある場合は、CSV変換を完全にスキップして実行できます

  $line = fgets($file, MAX_EXPECTED_LINE_LEN);
  // This splits '  A, B, C ' into 'A', ' B' and ' C' (note spaces)
  $row = explode(',', trim($line)); // other delimiters can be used

また

  // Consider "  , ", "," and ", " as the same delimiter
  // i.e. ' Alpha , Beta   ,    Gamma  ' gets split into 'Alpha', 'Beta' and 'Gamma'
  $row = preg_split('#\\s*,\\s*#', trim($line));

私はあなたが経験している問題を再現できないようです。行末の異なるエンコーディング(つまり、LFではなくCRLF)に関連している可能性がありますか?

fgetcsvピンチでは、2つのコンポーネントにfgets分割しstr_getcsv()、呼び出し間の行を操作できます(でtrim、または最悪の場合は、欠落しているコンマを追加して)。

于 2012-08-22T14:35:54.767 に答える
0

それはこのように私に働きます:

while ($row = $stmt -> fecht()){
     echo "\"";
     echo $row['email'];
     echo "\"";
     // Export every row to a file
     $arr = array(',');
     fputcsv($data, $arr, ";", '"' );
}
于 2015-12-08T10:54:22.677 に答える