2010-02-23 20 views
12

Kullanıcı tarafından PHP ile yüklenen CSV dosyalarını ayrıştırmaya çalışıyorum ancak düzgün çalışmıyor.fgetcsv ile çalışmayan CSV'ler yok

Çok sayıda düzgün biçimlendirilmiş CSV yükledim ve iyi çalıştı; Excel'den aktarılan CSV dosyalarını içe aktarmaya çalışan birçok kullanıcı var ve sorun yaşıyorlar. Dosyaları benimkiyle karşılaştırdım ve Excel dosyalarının hepsinin girişler etrafında alıntı yapmadığını fark ettim. Bunun yanı sıra, aynıdır. Açar ve Open Office ile kaydedersem, hiçbir değişiklik yapmadan çalışır. Bu yüzden alıntılar ile ilgili oldukça eminim.

Soruma; Bu hatalı biçimlendirilmiş CSV'leri nasıl okuyabilirim?

GÜNCELLEME: Nedeni bulundu!

Bu, Excel'in Mac sürümüne özgüdür. Satır sonları, bazı keyfi nedenlerle Mac'lerde farklı şekilde işlenir, bu nedenle fgetcsv kullanmadan önce bunu yapmanız gerekir;

ini_set('auto_detect_line_endings',TRUE); 
+0

Bize kodunuzu gösterebilir ve sorunun ne olduğunu bize söyleyebilir misiniz? Biçimlendirmeden bağımsız olarak fgetcsv() öğesini sorunsuz olarak kullanıyoruz. – jasonbar

+0

Bu dostum için teşekkürler! hayat kurtarıcı –

cevap

22

Bu, Excel'in Mac sürümüne özgüdür. Satır sonları, bazı keyfi nedenlerle Mac'lerde farklı şekilde işlenir, bu nedenle fgetcsv kullanmadan önce bunu yapmanız gerekir;

ini_set('auto_detect_line_endings',TRUE); 
+0

Teşekkür ederim! Mükemmel çalışıyor. – tbradley22

+0

Freaking. Muhteşem. Bulun. – Stegrex

1

manual page of fgetcsv baktığımızda, onun prototipi aşağıdaki gibidir:

array fgetcsv (resource $handle [, int $length 
    [, string $delimiter = ',' [, string $enclosure = '"' 
    [, string $escape = '\\' ]]]]) 

$enclosure(yani 4 parametre) için varsayılan değer olan çift tırnak.

Herhangi bir muhafaza istemediğinizi belirttiğinizde, bu 4. parametre için boş bir dize belirtmeyi denerseniz ne olur?

(Bu, şu anda çalışmakta olan şeyi bozabilir - bu da iki ayrı durumla başa çıkmak zorunda kalacağınız anlamına gelir: çift tırnak içine alınmış alanlar içeren dosyalar ve ilk okunamayan dosyalar durum)

+0

Evet, bunu gördüm. Ama dediğin gibi, şu anda çalışmakta olan şeyi kırıyor. Hangi formatta saklandığını kontrol etmenin ve davranışı uygun şekilde değiştirmenin basit bir yolu yok mu? –

+0

Bazı regexlerin bir dosyanın hangi formatta olduğunu belirlemenizi sağladığını varsayalım; Başka bir çözüm, her zaman ilk * (en sık rastlanan durum) * çözümünü denemek ve eğer işe yaramazsa, ikincisini deneyin; Dosyanızın tüm satırları muhtemelen aynı şekilde biçimlendirilir, sadece ilk satır için sınama yapmak yeterli olmalıdır - yani "fgetcsv" için yalnızca 1 "yararsız" çağrı yapmak anlamına gelir. –

+0

Bunu denedim, boş muhafazalar çıkmıyor ... –

İlgili konular