2010-04-30 2 views
12

J'ai un script qui génère un fichier csv en utilisant le code suivant:csv de production PHP ne pas envoyer correcte nouvelle ligne flux

header('Content-type: text/csv'); 
header('Content-Disposition: attachment; filename="'.date("Ymdhis").'.csv"'); 
print $content; 

La variable $ content contient simplement des lignes avec des champs séparés par des virgules, puis finalisé avec. "\ n"; pour générer une nouvelle ligne. Lorsque j'ouvre le fichier dans csv, il semble correct, quand j'essaie d'utiliser le fichier à importer dans un programme externe (MYOB), il ne reconnaît pas le caractère de fin de ligne (\ n) et suppose une longue ligne du texte. Lorsque je vois le contenu du fichier dans le bloc-notes, le caractère de fin de ligne (\ n) est un petit rectangle qui ressemble au code 0x7F.

Si j'ouvre le fichier et le réenregistre dans Excel, il supprime ce caractère et le remplace par un caractère de fin de ligne approprié et je peux importer le fichier.

Quel caractère dois-je générer en PHP pour que le bloc-notes le reconnaisse comme un caractère de fin de ligne valide? (\ n) ne fait évidemment pas le travail.

Répondre

20

Utilisez "\ r \ n". (avec des guillemets)

Ce qui précède est les caractères ascii pour le retour chariot + saut de ligne. Historiquement, cela concerne les premiers jours de calcul sur les télétypes lorsque la sortie a été imprimée sur papier et le retour du chariot de la tête de télétype au début de la ligne était une opération distincte pour alimenter une ligne à travers l'imprimante. Vous pouvez écraser des lignes en effectuant simplement un retour chariot et insérer des lignes vides par un simple saut de ligne. Faire tous les deux retourné la tête au début de la ligne et l'a nourri une nouvelle ligne à imprimer.

Quelle précision était nécessaire différait entre les systèmes -

  • alimentation ligne seulement: - la plupart Unix comme les systèmes
  • retour chariot et saut de ligne: DEC - amd systèmes MS-DOS
  • Retour chariot seulement : - Early Apple/Mac OS

Donc, ce que vous générez en ce moment, c'est une nouvelle ligne sur un système Unix seulement. Wikipedia a tout à fait un good page à ce sujet.

Il existe en fait des outils de ligne de commande Unix pour effectuer la conversion. Les commandes unix2dos et dos2unix convertissent les fichiers texte ASCII en avant et en arrière entre les formats UNIX et DOS en convertissant le saut de ligne en saut de ligne plus le retour chariot et vice versa.

4

Assurez-vous d'utiliser des guillemets autour du \ r \ n, pas les guillemets simples comme mentionné dans la réponse précédente!

0

J'ai rencontré le même problème. Plus tard j'ai remplacé
guillemets simples ' avec des guillemets " bâtiment $ contenu variable.

En conservant les guillemets externes plutôt que doubles en $ content variable.

Et cela a fonctionné :)

Questions connexes