33 votes

Lecture dans le fichier texte ligne par ligne php - nouvelle ligne non détectée

J'ai une fonction php que j'ai écrit qui prendra un fichier texte et une liste de chaque ligne comme une ligne dans une table.

Le problème, c'est le classique "fonctionne très bien sur ma machine", mais bien sûr, lorsque je demande à quelqu'un d'autre à générer de l' .fichier txt, je suis à la recherche d', il continue à lire dans le fichier entier en 1 seule ligne. Quand je l'ouvre dans mon éditeur de texte, il semble juste comme la façon dont je m'attends à voir avec un nouveau nom sur chaque ligne, mais son caractère de saut de ligne ou quelque chose de le jeter hors.

Jusqu'à présent j'en suis venu à la conclusion qu'il pourrait avoir quelque chose à faire avec ce que l'éditeur de texte qu'ils utilisent sur leur système Mac.

Est-il logique? et est-il un moyen facile de simplement détecter la présence de ce personnage que l'éditeur de texte est de reconnaître une nouvelle ligne et de le remplacer avec un standard que php va reconnaître?

Mise à JOUR: Ajout de la ligne suivante a résolu le problème.

ini_set('auto_detect_line_endings',true);

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>');
    }       
}

32voto

alphazero Points 17514

11voto

jmucchiello Points 10521

Quel est le problème avec file() ?

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

6voto

Ayman Hourieh Points 39435

À partir de la page de man de fgets:

Remarque: Si PHP n'est pas correctement en reconnaissant les fins de ligne lors de la lecture de fichiers sur ou créé par un ordinateur Macintosh, l'activation de la auto_detect_line_endings au moment de l'exécution de l'option de configuration peut aider à résoudre le problème.

Aussi, avez-vous essayé le fichier de la fonction? Elle retourne un tableau; chaque élément du tableau correspond à une ligne dans le fichier.

Edit: si vous n'avez pas accès au php.ini, ce serveur web utilisez-vous? Dans Apache, vous pouvez modifier les paramètres de PHP à l'aide d'un .fichier htaccess. Il y a aussi la fonction ini_set fonction qui permet de modifier les paramètres lors de l'exécution.

5voto

Chris Lutz Points 34157

C'est un cas classique de la nouvelle ligne problème.

ASCII définit différentes "saut de ligne" des personnages. Les deux les plus spécifiques, 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. utilisera LF comme un retour à la ligne. Mac OS Classic utilisés CR juste pour être différent, et que Windows utilise CR LF (c'est à droite, deux personnages pour un retour à la ligne - voir pourquoi personne n'aime Windows? C'est juste une blague) comme un retour à la ligne.

Par conséquent, les fichiers texte de quelqu'un sur un Mac (en supposant que c'est un système d'exploitation moderne) avons LF comme leur fin de ligne. Si vous essayez de les lire sur Windows, et Windows attend CR LF, il ne la trouvera pas. Maintenant, il a déjà été mentionné que PHP a la possibilité de trier ce mess pour vous, mais si vous préférez, voici une mémoire monopolisant la solution:

$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é).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X