php fputcsv ve çevreleyen alanlar

3 Cevap php

Ben burada aksed soru olarak aynı soruları sormak üzereydim .... http://stackoverflow.com/questions/2489553/forcing-fputcsv-to-use-enclosure-for-all-fields

Soruydu

When I use fputcsv to write out a line to an open file handle, PHP will add an enclosing character to any column that it believes needs it, but will leave other columns without the enclosures.

For example, you might end up with a line like this

11,"Bob ",Jenkins,"200 main st. USA ",etc

Short of appending a bogus space to the end of every field, is there any way to force fputcsv to always enclose columns with the enclosure (defaults to a ") character?

Cevap oldu:

No, fputcsv() only encloses the field under the following conditions

/* 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(' ')
)

Hayır "her zaman içine" seçeneği yoktur.

Kapalı her alanda ... Ne iyi çözüm olacağını olacak bir CSV dosyası oluşturmanız gerekir?

Şimdiden teşekkürler ...

3 Cevap

Kendi işlevi rulo - onun zor değil:

 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;
 }

(Yukarıdaki kaçan unix tarzı kullanıyor)

C.

Sadece CSV dosyasını yazmak. O orada en önemsiz dosya formatları biri.

foreach($lines as $lineArray)
{
    echo '"' . implode('", "', $lineArray) . '"' . "\n";
}

Bunun yarısı. Sizin değerler tırnak işaretleri olabilir varsa, o kaçmak gerekir.

Bir geçici çözüm: Bir 2-boyutlu bir dizi veri var düşünürsek, sen alıntı zorlamak ve emin bir dize ekleyebilirsiniz veri bulunan ("# @ # @" Burada) ve daha sonra kaldırmak değil:

    $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);