2010-03-25 21 views
7

Burada aksed soru aynı soru sormak üzereydim .... Forcing fputcsv to Use Enclosure For *all* Fieldsphp fputcsv ve çevreleyen alanlar

soruydu

Ben Sadece hat yazmak için fputcsv kullandığınızda açık bir dosya koluna, PHP onu ihtiyacı olduğunu herhangi bir sütun için kapatıcı bir karakter katacak, ama muhafazaları olmadan diğer sütunları bırakacaktır.

Örneğin, bu

11 gibi bir hattı ile bitirmek olabilir, "Bob" Jenkins, "200 main st. ABD ", bir sahte boşluk da ekleyebilirsiniz vb

Kısa her bir alanın sonunda, her bir karakter (bir "varsayılan olarak ) mahfaza ile sütun içine için fputcsv zorlamak için herhangi bir yol var?

cevap oldu:

Hayır, fputcsv() yalnızca aşağıdaki koşulların

/* 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

altındaki alanı çevreler.

Her alanın kapalı olacağı bir CSV dosyası oluşturmam gerekiyor ... En iyi çözüm ne olurdu? peşin

Teşekkür ...

+0

php kaynaklarını değiştirmek bir seçenek olabilir mi? Yani Sizin durumunuzda mümkün olan fonksiyon parametrelerine "her zaman kapalı" bayrak ekliyor? – VolkerK

cevap

7

Rulo kendi fonksiyonu - onun zor değil:

C

+0

$ file_handle, $ data_array $, muhafaza, $ field_sep, $ record_sep - can ... değerler ... geçirilecek gerek, lütfen vardır peşin – Anudeep

+0

bu değişken @symcbean için geçmesi gereken değeri $ file_handle teşekkür ederim ne örnek – Anudeep

+0

geri dönüş getirileri ($ file_handle, $ muhafaza . ($ Muhafaza. $ Alan_sep. $ Kasa, $ data_dizisi) . $ Muhafaza. $ Record_sep); Bu satırda hata alıyorum Mesaj: Dize dönüştürme dizisi – Anudeep

1

bir geçici çözüm (yukarıda kaçan unix stilini kullanıyor)

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

: Verilerinizi 2 boyutlu bir dizide bulundurduğunuzu varsayarak, alıntı yapmaya zorlayacak bir dizeyi ekleyebilir ve verilerinizde ("# @ @ #") bulunmadığından emin olabilirsiniz ve sonra kaldırmanız gerekir.

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