2009-05-03 10 views
32

Ho una funzione php ho scritto che avrà un file di testo ed elencare ogni riga come propria riga di una tabella.Leggi in linea file di testo per riga php - a capo non essere scoperti

Il problema è il classico "funziona bene sulla mia macchina", ma ovviamente quando chiedo a qualcun altro di generare il file .txt che sto cercando, continua a leggere nell'intero file come 1 riga. Quando lo apro nel mio editor di testo, sembra proprio come me lo aspetterei con un nuovo nome su ogni riga, ma è il carattere di nuova riga o qualcosa da buttare via.

Finora ho giunto alla conclusione che potrebbe avere qualcosa a che fare con tutto ciò editor di testo che stanno utilizzando sul proprio sistema Mac.

Ha senso? e c'è un modo semplice per rilevare questo personaggio che l'editor di testo riconosce come una nuova riga e sostituirlo con uno standard che php riconoscerà?

AGGIORNAMENTO: l'aggiunta della seguente riga ha risolto il problema.

ini_set('auto_detect_line_endings',true); 

Funzione:

function displayTXTList($fileName) { 
    if(file_exists($fileName)) { 
     $file = fopen($fileName,'r'); 
     while(!feof($file)) { 
      $name = fgets($file); 
      echo('<tr><td align="center">'.$name.'</td></tr>'); 
     } 
     fclose($file); 
    } else { 
     echo('<tr><td align="center">placeholder</td></tr>'); 
    }  
} 
+6

Mac, non MAC, per favore. –

risposta

6

Dalla pagina man di fgets:

Nota: Se il PHP non riconosce correttamente la fine riga nella lettura di file su o creati da un computer Macintosh, consentendo al auto_detect_line_endings run- l'opzione di configurazione del tempo può aiutare a risolvere il problema.

Inoltre, hai provato la funzione file? Restituisce un array; ogni elemento dell'array corrisponde a una linea nel file.

Edit: se non si ha accesso al file php.ini, quale server web stai usando? In Apache, puoi modificare le impostazioni di PHP usando a .htaccess file. C'è anche la funzione ini_set che consente di modificare le impostazioni in fase di esecuzione.

5

Questo è un caso classico del problema newline.

ASCII definisce diversi caratteri "newline". I due specifici che ci interessano sono ASCII 10 (line feed, LF) e 13 (carriage return, CR).

Tutti i sistemi basati su Unix, tra cui OS X, Linux, ecc useranno LF come un ritorno a capo. Mac OS Classic ha utilizzato il CR solo per essere diverso, e Windows usa CR LF (è vero, due caratteri per una nuova riga - vedi perché a nessuno piace Windows? Sto scherzando) come una nuova riga.

Quindi, i file di testo da parte di qualcuno su un Mac (supponendo che è un sistema operativo moderno) sarebbero tutti hanno LF come porre fine alla loro linea. Se stai cercando di leggerli su Windows e Windows si aspetta CR LF, non lo troverà. Ora, it has already been mentioned che PHP ha la capacità di risolvere questo casino per voi, ma se preferite, ecco una soluzione di memoria-hogging:

$file = file_get_contents("filename"); 
$array = split("/\012\015?/", $file); # won't work for Mac Classic 

Naturalmente, si può fare la stessa cosa con file() (as has already been mentioned).

11

Cosa c'è che non va con file()?

foreach (file($fileName) as $name) { 
    echo('<tr><td align="center">'.$name.'</td></tr>'); 
} 
+3

Senza l'aggiunta di ini_set ('auto_detect_line_endings', true); Questo non sembra aiutare il problema. – TaRDy

+0

questo ** funziona ** – emaillenin

+1

Va anche notato che 'file()' legge l'intero file in un array, o più specificamente, in memoria. Questa soluzione, benché funzioni sicuramente, è sconsigliata quando si lavora con file di grandi dimensioni. – newfurniturey

Problemi correlati