Domanda

Sto cercando di leggere un file CSV generato da M $ Excel su Linux.

Il file ha citato colonne multilinea (separate da x0A) e una terminazione di linea 0x0d0a.

PHP su Linux usa 0x0a come terminatore di linea, quindi tutti gli strumenti basati su linea (file, fgets, fgetcsv) pensano che ci siano interruzioni dei record nel mezzo delle celle di dati.

A corto di elaborazione del file byte per byte, posso modificare temporaneamente il carattere di fine riga di PHP (costante PHP_EOL) in modo da poter analizzare facilmente il file.

Penso che si possa fare in perl con " $ \ " ;. C'è qualcosa di simile in PHP?

Mi rendo conto di poter analizzare byte per byte, ma sto cercando un approccio più pulito.

È stato utile?

Soluzione

Se il suggerimento di conceptDawg di auto_detect_line_endings non funziona, consiglierei di leggere l'intero file tramite file_get_contents () e quindi chiamando explode () per suddividere il file in più righe. Puoi passare qualunque personaggio desideri explode()

Altri suggerimenti

Potresti provare a utilizzare l'opzione di configurazione di runtime " auto_detect_line_endings ". Dice che l'utilizzo di questo determinerà automaticamente le terminazioni di riga corrette. Dai documenti:

  

Se attivato, PHP esaminerà i dati letti da fgets () e file () per vedere se utilizza convenzioni di fine linea Unix, MS-Dos o Macintosh.

     

Ciò consente a PHP di interagire con i sistemi Macintosh, ma per impostazione predefinita è Disattivo, in quanto vi è una penalità di prestazione molto piccola quando si rilevano le convenzioni EOL per la prima riga, e anche perché le persone che usano i ritorni a capo come separatori di articoli nei sistemi Unix sperimentare comportamenti non compatibili con le versioni precedenti.

Se non funziona, puoi sempre leggere l'intero file in memoria (a seconda della dimensione del file potrebbe non essere fattibile) e fare un preg_replace sui caratteri in questione, sostituendoli con il " corretto " caratteri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top