2009-05-03 26 views
32

Tengo una función php que escribí que tomará un archivo de texto y mostrará cada línea como su propia fila en una tabla.Leer en archivo de texto línea por línea php - no se detectó nueva línea

El problema es que el clásico "funciona bien en mi máquina", pero por supuesto cuando le pido a otra persona que genere el archivo .txt que estoy buscando, sigue leyendo en todo el archivo como 1 línea. Cuando lo abro en mi editor de texto, se ve igual que como lo esperaría con un nuevo nombre en cada línea, pero es el carácter de nueva línea o algo que lo descarta.

Hasta ahora he llegado a la conclusión de que podría tener algo que ver con cualquier editor de texto que estén usando en su sistema Mac.

¿Tiene esto sentido? y ¿hay alguna manera fácil de detectar este carácter que el editor de texto está reconociendo como una nueva línea y reemplazarlo por uno estándar que php reconocerá?

ACTUALIZACIÓN: Agregar la siguiente línea resolvió el problema.

ini_set('auto_detect_line_endings',true); 

Función:

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, no MAC, por favor. –

Respuesta

6

Desde la página del manual de fgets:

Nota: Si PHP no está reconociendo los finales de línea cuando lee archivos ya sea dentro o creado por un ordenador Macintosh, lo que permite el Run-auto_detect_line_endings la opción de configuración de tiempo puede ayudar a resolver el problema.

Además, ¿ha probado la función file? Devuelve una matriz; cada elemento en la matriz corresponde a una línea en el archivo.

Editar: si no tiene acceso a php.ini, ¿qué servidor web está utilizando? En Apache, puede cambiar la configuración de PHP usando a .htaccess file. También está la función ini_set que permite cambiar la configuración en tiempo de ejecución.

5

Este es un caso clásico del problema de la nueva línea.

ASCII define varios caracteres diferentes de "nueva línea". Los dos específicos que nos interesan son ASCII 10 (alimentación de línea, LF) y 13 (retorno de carro, CR).

Todos los sistemas basados ​​en Unix, incluyendo OS X, Linux, etc. usarán LF como una nueva línea. Mac OS Classic usó CR para ser diferente, y Windows usa CR LF (es correcto, dos caracteres para una nueva línea - vea por qué a nadie le gusta Windows, es una broma) como una nueva línea.

Por lo tanto, los archivos de texto de alguien en una Mac (suponiendo que sea un SO moderno) tendrían LF como final de línea. Si intenta leerlos en Windows, y Windows espera CR LF, no lo encontrará. Ahora, it has already been mentioned que PHP tiene la capacidad de ordenar este lío para usted, pero si usted prefiere, he aquí una solución de memoria acaparando:

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

Por supuesto, usted puede hacer lo mismo con file() (as has already been mentioned).

11

¿Qué pasa con file()?

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

Sin la adición de ini_set ('auto_detect_line_endings', true); Esto no parece ayudar al problema. – TaRDy

+0

éste ** funciona ** – emaillenin

+1

También se debe tener en cuenta que 'archivo()' lee todo el archivo en una matriz, o más específicamente, en la memoria. Esta solución, aunque definitivamente funciona, no es aconsejable cuando se trabaja con archivos de gran tamaño. – newfurniturey

Cuestiones relacionadas