9

ここで尋ねた質問と同じ質問をしようとしていました.... fputcsvに*すべての*フィールドにエンクロージャーを使用するように強制します

質問は

fputcsvを使用して開いているファイルハンドルに行を書き出すと、PHPは必要と思われる列に囲み文字を追加しますが、他の列は囲みなしのままにします。

たとえば、次のような行になる可能性があります

11、「ボブ」、ジェンキンス、「200mainst.USA」など

すべてのフィールドの最後に偽のスペースを追加する以外に、fputcsvが常に列を囲み(デフォルトは「)文字で囲むように強制する方法はありますか?

答えは:

いいえ、fputcsv()は、次の条件下でのみフィールドを囲みます

/* enclose a field that contains a delimiter, an enclosure character, or a newline */
if (FPUTCSV_FLD_CHK(delimiter) ||
  FPUTCSV_FLD_CHK(enclosure) ||
  FPUTCSV_FLD_CHK(escape_char) ||
  FPUTCSV_FLD_CHK('\n') ||
  FPUTCSV_FLD_CHK('\r') ||
  FPUTCSV_FLD_CHK('\t') ||
  FPUTCSV_FLD_CHK(' ')
)

「常に囲む」オプションはありません。

CSVファイルを作成する必要がありますすべてのフィールドが囲まれます...最良の解決策は何でしょうか?

前もって感謝します...

4

3 に答える 3

9

あなた自身の機能を転がしてください-それは難しいことではありません:

 function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep)
 {
     dumbescape(false, $enclosure);
     $data_array=array_map('dumbescape',$data_array);
     return fputs($file_handle, 
         $enclosure 
         . implode($enclosure . $field_sep . $enclosure, $data_array)
         . $enclosure . $record_sep);
 }
 function dumbescape($in, $enclosure=false)
 {
    static $enc;
    if ($enclosure===false) {
        return str_replace($enc, '\\' . $enc, $in);
    }
    $enc=$enclosure;
 }

(上記はUNIXスタイルのエスケープを使用しています)

C。

于 2010-03-25T13:43:47.613 に答える
1

回避策:データが2次元配列にある場合、引用符を強制する文字列を追加し、データに含まれていないことを確認してから(ここでは "#@ @#")、削除します。

    $fp = fopen($filename, 'w');
    foreach ($data as $line => $row) {
        foreach ($row as $key => $value) {
            $row[$key] = $value."#@ @#";
        }           
        fputcsv($fp, $row);
    }

    fclose($fp);
    $contents = file_get_contents($filename);
    $contents = str_replace("#@ @#", "", $contents);
    file_put_contents($filename, $contents);
于 2011-02-11T11:00:27.670 に答える
0

同じ問題が発生し、次のように解決しました。
各配列値に一重引用符を挿入しました。
このように、Excelでcsvファイルを開くと、科学的記数法E+15は表示されなくなります。

ここで私がしたようにあなたを共有します。

これは私のために働きました、私はあなたもそうすることを望みます。
よろしく

        // this function add a single quote for each member of array
         function insertquote($value) {
            return "'$value'";
        }

        # here i send each value of array 
        # to a insertquote function, and returns an array with new values, 
        # with the single quote.

        foreach ($list as $ferow) {
            fputcsv($fp, array_map(insertquote, $ferrow), ';');
        }
于 2019-12-17T21:31:15.767 に答える