web-dev-qa-db-fra.com

Lire le fichier texte ligne par ligne php - la nouvelle ligne n'est pas détectée

J'ai une fonction php que j'ai écrite qui prendra un fichier texte et listera chaque ligne comme sa propre ligne dans un tableau.

Le problème est le classique "fonctionne bien sur ma machine", mais bien sûr quand je demande à quelqu'un d'autre de générer le fichier .txt que je recherche, il continue à lire dans le fichier entier en 1 ligne. Lorsque je l'ouvre dans mon éditeur de texte, il ressemble à ce que j'attendrais avec un nouveau nom sur chaque ligne, mais c'est le caractère de nouvelle ligne ou quelque chose qui le jette.

Jusqu'à présent, je suis arrivé à la conclusion que cela pourrait avoir quelque chose à voir avec l'éditeur de texte qu'ils utilisent sur leur système Mac.

Est-ce que ça a du sens? et existe-t-il un moyen simple de détecter ce caractère que l'éditeur de texte reconnaît comme une nouvelle ligne et de le remplacer par un caractère standard que php reconnaîtra?

MISE À JOUR: L'ajout de la ligne suivante a résolu le problème.

ini_set('auto_detect_line_endings',true);

Une fonction:

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>');
    }       
}
33
TaRDy
32
alphazero

Quel est le problème avec file() ?

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

Depuis la page de manuel de fgets :

Remarque: Si PHP ne reconnaît pas correctement les fins de ligne lors de la lecture de fichiers sur ou créés par un ordinateur Macintosh, l'activation de l'option de configuration d'exécution auto_detect_line_endings == peut aider à résoudre le problème.

Avez-vous également essayé la fonction fichier ? Il renvoie un tableau; chaque élément du tableau correspond à une ligne du fichier.

Edit: si vous n'avez pas accès au php.ini, quel serveur web utilisez-vous? Dans Apache, vous pouvez modifier les paramètres PHP en utilisant n fichier .htaccess . Il existe également la fonction ini_set qui permet de modifier les paramètres lors de l'exécution.

6
Ayman Hourieh

Il s'agit d'un cas classique du problème de nouvelle ligne.

ASCII définit plusieurs caractères de "nouvelle ligne" différents. Les deux spécifiques dont nous nous soucions sont ASCII 10 (saut de ligne, LF) et 13 (retour chariot, CR).

Tous les systèmes basés sur Unix, y compris OS X, Linux, etc. utiliseront LF comme nouvelle ligne. Mac OS Classic a utilisé CR juste pour être différent, et Windows utilise CR LF (c'est vrai, deux caractères pour une nouvelle ligne - voyez pourquoi personne n'aime Windows? Je plaisante) comme nouvelle ligne.

Par conséquent, les fichiers texte de quelqu'un sur un Mac (en supposant qu'il s'agit d'un système d'exploitation moderne) auraient tous LF comme fin de ligne. Si vous essayez de les lire sur Windows, et Windows attend CR LF , il ne le trouvera pas. Maintenant, il a déjà été mentionné que PHP a la capacité de trier ce gâchis pour vous, mais si vous préférez, voici une solution de mémoire-hogging:

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

Bien sûr, vous pouvez faire la même chose avec file() ( comme cela a déjà été mentionné ).

5
Chris Lutz