L'importation de CSV qui a des sauts de ligne dans le champs
J'utilise PHP pour importer un fichier CSV, qui est originaire d'une feuille de calcul excel. Certains champs contiennent des sauts de ligne, alors quand j'ai rouvrir le csv dans excel, open office tableur, il méconnaît où les sauts de ligne qui doit arriver.
Aussi dans mon script, en utilisant fgetcsv pour aller à chaque ligne, il est mal de coupure de ligne où il ne devrait pas l'être.
J'ai pu nettoyer manuellement les données, mais) qui prendrait des lustres comme un 10k ligne du fichier, et b) les données sont exportées à partir d'un clients existants morceau de logiciel
Des idées sur la façon de résoudre automatiquement ce sur le processus d'importation? J'aurais pensé à délimiter les champs aurait triés, mais il ne le fait pas.
"foo\nbar"
la colonne alignements ne devraient pas être affectéesLF doit être codé comme
\n
dans les champs CSV. Vous aurez besoin d'un lecteur personnalisé pour annuler que l'exportation des dommages. Regardez à travers les php.net/fgetcsv, mais vous aurez probablement à la recherche ou à l'écrire.double possible (stackoverflow.com/questions/3278375/... )
xzyfer, cette solution ne marchera pas car j'ai besoin de la capacité de commencer à une ligne en particulier à partir du pointeur de fichier, comme le chargement d'un ensemble de 15 mo csv dans une chaîne sur un serveur de production n'est pas d'aller travailler 🙁 merci de toute façon si
OriginalL'auteur Horse | 2011-03-29
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce problème aussi, et n'a pas trouvé une façon de lire correctement les données.
Dans mon cas, c'était une seule fois-à l'importation, alors j'ai fait un script qui recherche pour toutes les sauts de lignes dans une colonne et l'a remplacé par quelque chose comme
#####
. Ensuite j'ai importé les données et les a remplacé par des retours à la ligne (.Si vous avez besoin d'un régulier de l'importation, vous pouvez écrire vous possédez CSV-Analyseur, qui gère le problème. Si le texte-les colonnes sont dans
""
vous pourriez traiter tout ce qui est entre deux""
comme l'une des colonnes (à vérifier échappé"
dans le contenu).OriginalL'auteur MacGucky
Accepté la réponse ne résout pas le problème pour moi, mais j'ai finalement trouvé ce CSV parser sur google code qui fonctionne bien pour plusieurs lignes de champs dans le format CSV.
parsecsv-pour-php:
https://github.com/parsecsv/parsecsv-for-php
Pour des raisons historiques, l'origine, le projet d'accueil est:
http://code.google.com/p/parsecsv-for-php/
+1 C'est à ce jour le meilleur analyseur de autour de! mieux que str_getcsv ou semblables. Mes données contenues HTML et de nouvelles lignes dans les champs. C'est le seul analyseur qui a raison! Merci!
C'est une sorte de triste, c'est si dur de trouver un précise de l'analyseur pour l'un des formats les plus courants pour l'un des plus largement utilisé des langages de programmation. Je suppose que c'est en partie car il n'y a pas de norme officielle, mais les sauts de ligne à l'intérieur des valeurs à la cote est CERTAINEMENT quelque chose d'un CSV analyseur doit être capable de gérer.
Cela devrait être approuvé réponse. Merci
OriginalL'auteur danieltalsky
Ma solution est la suivante:
http://php.net/manual/en/function.nl2br.php
Une fois que vous obtenez à la cellule individuelle (string), l'exécuter sur la chaîne et il vous permet de convertir les retours à la ligne (au format html des pauses pour vous.
OriginalL'auteur Mike Wilding
Oui vous avez besoin de trouver que les virgules et les remplacer par des caractères spéciaux comme la combinaison de
{()}
et enfin de les remplacer par,
que vous êtes à l'origine à la recherche pour.Espère que vous aide.
OriginalL'auteur Aditya P Bhatt
Bien que c'est une vieille question, la réponse pourrait être encore pertinent pour le ppl.
Il est actuellement à la nouvelle bibliothèque (cadre indépendant) http://csv.thephpleague.com/ qui prend en charge NL caractères dans les champs ainsi que certains de filtrage.
OriginalL'auteur ghispi
C'est un vieux thread mais j'ai rencontré ce problème et je l'ai résolu avec une expression régulière de sorte que vous pouvez éviter une bibliothèque juste pour ça. Ici le code est en PHP, mais il peut être adapté à d'autres langues.
$parsedCSV = preg_replace('/(,|\n|^)"(?:([^\n"]*)\n([^\n"]*))*"/', '$1"$2 $3"', $parsedCSV);
Cette solutions suppose les champs contenant un saut de ligne sont entourés par des guillemets, ce qui semble être une hypothèse valable, au moins pour ce que j'ai vu jusqu'à présent. Aussi, les guillemets doivent suivre un
,
ou être placé au début d'une nouvelle ligne (ou la première ligne).Exemple:
field1,"field2-part1\nfield2-part2",field3
Ici le \n est remplacé par un espace de sorte que le résultat serait:
field1,"field2-part1 field2-part2",field3
La regex doit gérer de multiples retours à la ligne (comme.
Cela pourrait ne pas être efficace si le contenu est trop grand, mais ça peut aider pour de nombreux cas, et l'idée peut être réutilisé, peut-être optimisé en faisant cela pour de plus petits morceaux (mais vous auriez besoin pour gérer les baisses de fixer la taille tampon).
OriginalL'auteur V. Högman