2010-02-23 19 views
12

Ich versuche CSV-Dateien zu analysieren, die vom Benutzer über PHP hochgeladen wurden, aber es funktioniert nicht richtig.CSVs ohne Anführungszeichen funktioniert nicht mit fgetcsv

Ich habe mehrere korrekt formatierte CSVs hochgeladen und es funktionierte jedoch gut; Ich habe viele Benutzer versucht, aus Excel exportierte CSV-Dateien zu importieren, und sie haben Probleme. Ich habe die Dateien mit meinen verglichen und festgestellt, dass die Excel-Dateien keine Anführungszeichen enthalten. Abgesehen davon sind sie identisch. Wenn ich es öffne und mit Open Office speichere, ohne es zu ändern, funktioniert es. Ich bin ziemlich sicher, dass es mit den Zitaten zusammenhängt.

Meine Frage ist; Wie lese ich diese falsch formatierten CSVs?

UPDATE: Ursache wurde gefunden!

Dies ist spezifisch für die Mac-Version von Excel. Zeilenumbrüche werden aus irgendwelchen Gründen auf Macs unterschiedlich gehandhabt, also sollten Sie dies tun, bevor Sie fgetcsv verwenden;

ini_set('auto_detect_line_endings',TRUE); 
+0

Können Sie uns Ihren Code zeigen und uns sagen, was das Problem ist? Wir verwenden fgetcsv() ohne Probleme, unabhängig von der Formatierung. – jasonbar

+0

Danke für diesen Kerl !! Lebensretter –

Antwort

22

Dies ist spezifisch für die Mac-Version von Excel. Zeilenumbrüche werden aus irgendwelchen Gründen auf Macs unterschiedlich gehandhabt, also sollten Sie dies tun, bevor Sie fgetcsv verwenden;

ini_set('auto_detect_line_endings',TRUE); 
+0

danke! funktioniert perfekt. – tbradley22

+0

Freaking. Genial. Finden. – Stegrex

1

Mit Blick auf die manual page of fgetcsv, sieht dessen Prototyp wie folgt aus:

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

Der Standardwert für $enclosure(das heißt der 4. Parameter) ist ein doppeltes Anführungszeichen.

Was ist, wenn Sie versuchen, anzugeben, dass Sie kein Gehäuse möchten, indem Sie für diesen vierten Parameter eine leere Zeichenfolge angeben?

(Natürlich könnte dies brechen, was jetzt funktioniert - was bedeutet, dass Sie mit zwei getrennten Fällen zu tun haben würden: Dateien mit Feldern in doppelten Anführungszeichen eingeschlossen ist, und Dateien, die nicht durch die ersten gelesen werden konnte Fall)

+0

Ja, das habe ich gesehen. Aber, wie Sie sagten, es bricht, was gerade funktioniert. Gibt es keine einfache Möglichkeit zu überprüfen, in welchem ​​Format es gespeichert ist und das Verhalten entsprechend zu ändern? –

+0

Ich nehme an, dass einige Regex Sie bestimmen können, in welchem ​​Format eine Datei ist ;; eine andere Lösung wäre, immer die erste * (häufigste Fall) * Lösung zu versuchen, und, wenn es nicht funktioniert, versuchen Sie die zweite ;; Wenn man bedenkt, dass alle Zeilen Ihrer Datei wahrscheinlich genauso formatiert sind, sollte der Test nur für die erste Zeile ausreichen - was bedeutet, dass Sie nur einen "nutzlosen" Aufruf an "fgetcsv" machen würden. –

+0

Ich habe das versucht, es stellt sich heraus, leere Gehäuse funktionieren nicht ... –

Verwandte Themen