2010-09-28 18 views
10

Yani, benim kod PHP'nin yerleşik içinde fputcsv işlevini kullanarak bir CSV dosyası oluşturur. sınırlayıcı için Wrap CSV değerler"

, I ',' (virgül) kullanın.
Kasa için '"' (çift tırnak) kullanıyorum. Ancak

, ben

fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"'); 

gibi bir şey bu

a,b,"long string, with commas",, 

verir deneyin ama çıkış

"a","b","long string, with commas","","" 

bunu istiyorum bu başa kolay bir yolu var mı veya fputcsv için bir yedek yazmalı mıyım?

+1

çıkış geçerli bir CSV olduğunu. Diğer aletiniz bozuk. –

+0

Neden her alandaki alıntıları istiyorsun? –

+1

@Ignacio, Andrew: Görünüşe göre, elektronik tablo yazılımında içe aktarma iletişim kutusunun küçük bir köşesinde gizli olarak birden fazla boş alanı yoğunlaştırmak ('a ,,,' => a, ') ve/veya onları kaldırmak (' a ,,, '=>' a'). Ve görünüşe göre bazı kullanıcılar bunu kontrol ediyor ve bilmiyorlar, bu yüzden tek, kolay, tek bir çözüm, her boş alanı boş bir dize ("a," "," "," "'). –

cevap

9

Bu genellikle CSV dosyaları için bir problem değildir. Belirsiz olurdu

fputcsv değeri etrafında tırnak koyar. Örneğin,

a,b,"long string, with commas",, 

belirsiz olmayan, ancak,

a,b,long string, with commas,, 

ve en çok olarak (okuma: Tüm) durumlar da 5'ten fazla alana sahip olduğu CSV okuyucu tarafından yorumlanabilir.

CSV ayrıştırıcıları, çevrelerindeki tırnak işaretleri olmadan bile dizgi değişmezlerini kabul eder.

yine değerler etrafında tırnak istiyorsanız, aşağıdaki pasajı bunu yapar. Bu dize içinde tırnak kaçış değil - egzersiz okuyucuya bırakılır o:

$row = '"' . implode('", "', $rowitems) . '"'; 

Sen tüm satırlar için bir döngü içinde bu koymak isterim.

+0

Evet, belirsizlik hakkında biliyorum, ama gerçekten tırnaklara sarılmış ihtiyacım olan boş kısımlar. Boş olmayan bölümler sarılmadan yaşayabilirim (tabii ki belirsiz olanlar hariç). –

+0

Yorumunuz kafa karıştırıcı. Boş parçaların tırnak içine alınmasını istiyorsunuz, ancak boş olmayan parçalar sarmadan gidebilir mi? Ne demek istiyorsun? Yayınlanan snippet, tüm CSV ayrıştırıcılarıyla çalışması gereken tüm tekliflere sarılır. –

+0

Boşver. Kafam karışmıştı. Evet, bu işe yarayacak. Teşekkürler. –

0

sen str_replace edemez Herhangi bir neden (' "" '' ,,', $ çıkışı); ? Ayrıca son ya da ilk karakteri bir virgül olup olmadığını görmek zorunda ve eğer öyleyse, ben çözüm böyle olacağını düşünüyorum ile virgül ""

+0

Aslında bu benim ilk düşüncemdi, ama daha sonra dosya-yazmayı bir dizeye kesmem gerekiyordu. D: –

+1

Ah evet. Fputcsv'nin aslında ne yaptığını düşünmeyi tamamen unutmuşumdur. Verilerinden kaçan ve fputs veya fwrite kullanarak çıkaran kendi fonksiyonunuzu yazmanız daha iyi olur. – methodin

2

,

$order_header_arr = array("Item1", "Item2","This is Item3"); 
fputcsv($fp, $order_header_arr,',',' '); 

" " [Space hatırlamak değiştirecekti ] Ben bunları kaldırmayı sonra # @ boşluk, # @ ile, bazı sahte dize karakterleri ekleyerek ve bu sorunu çalıştı fputcsv

+0

Bu en hızlı ve en hızlı yanıt – RafaSashi

8

üçüncü parametre arasında.

//$exported is our array of data to export 
$filename = 'myfile.csv'; 
$fp = fopen($filename, 'w'); 
foreach ($exported as $line => $row) { 
    if ($line > 0) { 
     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); 

Bu

+0

Bu açık bir şekilde dosya açma ve kapatma işlemlerini gerektirir, ancak iyi çalışır. – iamjonesy

+0

Bu ayrıca, tüm sütunlardan ziyade belirli bir alan için ayarlamanıza izin verir +1 – input

+0

biraz yavaş ama bunun düzgün çalışması için tek yol, teşekkürler! – Damian

0

fputcsv tırnak tüm dizi değişkenleri içine olmayacaktır boş olanlar da dahil olmak çift tırnak tüm alanları çevreler: Aşağıda örnek bir uygulama bu. Tırnak olmadan sayısal bir dizi değerine sahip olmak doğru olabilir, ancak bir etiket veya adres programı sayısal olarak tanımlanmış bir ABD posta koduyla karşılaştığında sorun çıkarır çünkü yazdırma sırasında baştaki sıfırları soyar. Böylece 05123-0019, 5123-19 olur.onlar tırnak ben fgetsrc ile giriş dosyasını okumak ve fwrite düzeltilmiş versiyonunu yazabilir, mevcut olup olmadığı

, tüm değerleri içine alın. fgetsrc, dizi değişkenlerine kaydı okur. Fwrite bir değişken yazdığından, dizi değişkenlerini dizelemek, bunları tırnak içine almak ve dizi değişkenini virgülle ayırmanız gerekir. Ardından kayıt ayırıcıyı ekleyin.

<?php 
// fgetcsv - read array with fgetcsv and string into output variable 
// then write with fwrite 
// $ar is the array populated from fgetcsv and $arc is the variable strung 
// with array variables enclosed in quotes and written using fwrite. 
$file_in = fopen("reinOCp.csv","r") or die("Unable to open input file 
reinOCp.csv!"); 
$file_out = fopen("printLABEL.csv", "w") or die("Unable to open output file 
prtLABEL!"); 
while (!feof($file_in)) { //loop through each record of the input file 
    $ar=fgetcsv($file_in); //read the record into array $ar 
    if (is_array($ar)){ //this loop will string all the array values plus 
// the end of record into variable $arc and then write the variable 
     $arc = ""; //clear variable $arc 
     foreach ($ar as $value) {  
      $arc .= '"' . $value . '",'; // add the array values, enclose in 
// quotes with comma separator and store in variable $arc 
     } 
     $arc .= "\n"; //add end of record to variable $arc 
     fwrite($file_out, $arc) or die ("ERROR: Cannot write the file"); 
//write the record using variable $arc 
    } 
} 
echo "end of job"; 
fclose($file_in); 
fclose($file_out); 
?>