2010-10-26 33 views
3

J'essaie de générer dynamiquement un fichier csv avec des cellules qui contiendront plusieurs lignes, le champ adresse par exemple devra être groupé dans une seule cellule "adresse" au lieu de l'adresse , ville, état etc. Tout va bien et mais pour les deux derniers jours j'ai essayé d'insérer \ r, \ r \ n, \ n, chr (10), chr (13), aussi bien qu'un retour de chariot dans le code pour créer le retour chariot que je cherche dans la cellule. Tous ceux-ci échouent, soit étant littéralement imprimé dans mon csv comme "\ r" etc ou quand je fais un retour chariot manuel dans le code, il génère une nouvelle ligne. J'utilise ceci pour créer les ruptures dans mes cellules, mais il ne fonctionne pasCréation de retours chariot dans la cellule csv via php

$groupedCell = implode('\r',$data); 

Je suis assez sûr que le code est correct comme placer \ r où je voudrais un retour chariot, mais pas le réel retour je cherche. J'ai essayé différents encodages mais toujours pas de chance, je suis en train de tester Open Office, ce qui pourrait être le problème, mais je suppose qu'il peut gérer les retours chariot dans une cellule et je n'ai vu aucune documentation supportée autrement. Merci d'avoir lu!

+0

Collin, vous avez fait des progrès à ce sujet? Est-ce que le problème était basé sur PHP (peut utiliser des séquences d'échappement dans des guillemets simples en PHP) ou basé sur des spécifications CSV (différentes manières d'échapper des retours à la ligne in-cell)? – Rudu

+0

J'ai fini par ne pas casser la ligne. J'ai essayé toutes les solutions ici et rien n'a fonctionné. J'ai essayé les guillemets simples et doubles sans aide, bien qu'il soit bon de savoir que vous devez utiliser des guillemets doubles pour vous échapper. Peut-être que les CSV ne peuvent pas avoir cette fonctionnalité d'une manière universellement supportée? –

+0

Le truc, c'est deux choses différentes: des guillemets doubles pour utiliser des séquences d'échappement en PHP. Mais seulement parfois des guillemets doubles pour s'échapper dans des cellules CSV. – Rudu

Répondre

8

Vous devez utiliser "\r". Vous ne pouvez pas utiliser de caractères échappés (à l'exception de \') dans les chaînes entre guillemets simples. '\n' et '\r' sont un antislash littéral suivi d'un n ou r, tandis que "\n" et "\r" sont des retours à la ligne et des retours chariot respectivement. En ce qui concerne l'insertion de nouvelles lignes dans votre fichier CSV, cela dépend de votre implémentation. Il n'y a pas de norme pour le format CSV, vous devrez donc déterminer quel format utiliser en fonction du système auquel vous fournissez les données CSV. Certains pourraient accepter une séquence '\n' et l'interpréter comme une nouvelle ligne, d'autres pourraient autoriser un retour à la ligne littéral à condition que la cellule soit placée entre guillemets et que d'autres n'accepteraient pas du tout de nouvelles lignes.

+0

Je ne le savais pas, je vais donner un tour aux doubles quotes. Cela expliquerait pourquoi la chaîne est manipulée littéralement! –

12

Le CSV spec est un que je trouve implémenté de différentes manières ... il semble que ce soit seulement à moitié espacé ce qui est frustrant étant donné sa popularité.

Pour inclure une nouvelle ligne dans une cellule dans un fichier CSV, il peut être nécessaire d'encapsuler une cellule, ou la nouvelle ligne peut devoir être échappée. Vous remarquerez à partir du document lié, il y a trois façons de le faire - et différents programmes traiter différemment:

  1. Excel enveloppe la cellule entière dans des guillemets doubles: une cellule peut avoir (sans échappement) caractères de nouvelle ligne dans et être considéré comme une seule cellule, tant qu'il est entouré de guillemets doubles (notez aussi que vous devrez utiliser des doubles guillemets excel dans le contenu de la cellule)
  2. D'autres programmes insèrent une seule barre oblique inverse avant le caractère, donc une ligne se terminant par \ n'est pas considéré comme la fin d'une ligne, mais comme un caractère de retour à la ligne dans la cellule. Une cellule peut avoir des caractères de nouvelle ligne sans échappement tant qu'ils sont précédés de la barre oblique inverse.
  3. D'autres remplacent encore un saut de ligne avec un caractère de type C s'échappant, la séquence de caractères réelle \n ou \r\n. Dans ce cas, la cellule a entièrement échappé aux caractères de nouvelle ligne.

Le problème est aggravé par le besoin potentiel d'échapper aux caractères de contrôle (ainsi que d'autres contenus (par exemple " dans # 1 et # 2 \ à + 3) et différents styles de fuite (par exemple.un devis intégré pourrait être échappé comme: double double citation "" ou backslash-guillemet \")

Mon conseil: générer un document ouvert-office avec plusieurs lignes et des caractères d'échappement clés et voir comment génère ouvert office un CSV fichier. À partir de là, vous pouvez décider quelles méthodes utiliser pour les nouvelles lignes dans les cellules et quelle méthode d'échappement.

exemple de style-1 (Excel):

#num,str,num 
1,"Hello 
World",1990 
2,"Yes",1991 

exemple de style-2:

#num,str,num 
1,Hello \ 
Word,1990 
2,Yes,1991 

exemple de style-3:

#num,str,num 
1,Hello \nWorld,1990 
2,Yes,1991 
0
  1. Créé une feuille de calcul Excel 2010 avec 3 colonnes.
  2. Ajout d'une ligne de titre avec des valeurs littérales: un, deux, trois
  3. ligne de données Ajouté 1 avec des valeurs littérales: abc, abc, abc, sauf que, dans la 2e colonne I pressais ALT + ENTRER après chaque lettre pour créer une voiture retour et saut de ligne.
  4. SAUVEGARDE> AUTRE et choisissez CSV en ignorant les avertissements.
  5. Examiné les données CSV à l'aide de NOTEPAD ++ et cliqué sur le bouton Afficher tous les caractères dans la barre d'outils.

On peut voir les éléments suivants:

one, two, three[CR][LF] 
abc,"a[LF] 
b[LF] 
c",abc[CR][LF] 

Espérons que cela donne plus de précisions.