11
votes

Problème de pause de la ligne de CSV à MySQL

J'importe un fichier .csv dans MySQL et tout fonctionne bien, à l'exception des pauses de ligne qui se trouvent dans le fichier.

Une de mes lignes .CSV ressemble à ceci: P>

LOAD DATA LOCAL INFILE '/tmp/php89FC0F' REPLACE INTO TABLE `ohes_flyer_products`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\r'


13 commentaires

Qu'essayez-vous d'importer avec initialement, phpmyadmin ou console MySQL?


Je suppose que vous voulez dire le 6ème champ, cela commence par "Taille éprouvée ...


Pouvez-vous également publier l'instruction de données de charge MySQL exacte que vous utilisez?


J'ai le problème opposé, où j'exprime des données de MySQL à utiliser dans Excel pour des rapports et des champs contenant des pauses de ligne internes entraînant une pause de ligne pour la ligne, ce qui a entraîné une nouvelle ligne avec des données qui auraient dû être contenues dans la ligne précédente. . Ma solution consiste à utiliser le caractère de pipe (|) pour les pauses de ligne et tout convertir dans un éditeur de texte avant utilisation.


La déclaration MySQL est dans le message principal maintenant, et j'importe avec phpmyadmin.


Si j'ajoute \ n à la fin de chaque ligne dans le fichier .csv, cela fonctionne, mais cela devient assez fastidieux quand il y a quelques centaines de lignes ..


Le fichier CSV est-il venu directement d'Excel ou provenait d'une autre source? Le point que j'essaie d'obtenir est, savez-vous spécifiquement que le fichier CSV est délimité par un \ r ou a \ n et non a \ r \ n? Aussi quelle version de phpmyadmin êtes-vous?


J'ai initialement fait le fichier dans Excel, mais après avoir codé des problèmes, je l'ai ouvert dans Textmate et l'a enregistré comme UTF-8. Version PHP: 3.2.2 Version client MySQL: 5.0.45


Pouvez-vous essayer d'importer avec un délimiteur de ligne \ r \ n?


J'ai essayé cela et cela ne renvoie qu'une rangée plutôt que toutes. Je pense que j'ai lu quelque part que sur un mac, vous écrivez seulement \ r


Windows = \ R \ N (Excel créé par M $) Mac = \ r Linux \ Unix = \ n.


Il doit y avoir une meilleure façon, mais pour l'instant, je viens de mettre un \ n à la fin de chaque ligne dans le fichier .csv (sur Excel), puis l'a ouvert en textmate pour le convertir en UTF-8. Tout le processus ..


@Carson: Juste pour clarifier, votre problème est-il avec la sortie PHP de la ligne MySQL à HTML? Les navigateurs ignorent les caractères de la nouvelle ligne sauf lorsque le texte est dans les zones de texte. Lorsque vous envoyez une page sur une page, avez-vous essayé de l'enveloppement de texte dans la fonction NL2BR (PHP> NL2BR () ?


5 Réponses :


0
votes

Votre CSV semble être non standard, mais c'est souvent la réalité de traiter les jeux de données clients.

Comme des outils tels que le relevé de données de charge de MySQL sont faits pour gérer uniquement le cas d'utilisation parfait, j'ai trouvé que traiter avec des jeux de données non standard tels que celui-ci nécessite un code.

Un moyen de gérer ceci est d'abord graver votre CSV, remplaçant les pauses de ligne de champ médiane avec une chaîne unique unique (comme === Midfield_line_break === ). Ensuite, j'écrirais un analyseur CSV personnalisé dans une langue de script (Python, Ruby, PHP, Perl, etc.).

Dans votre analyseur CSV, itérale à travers des lignes dans le fichier. Pour chaque ligne:

  • Swap the \ n ou \ r BACK IN pour le === Midfield_line_break === caractères.
  • construire et exécuter une instruction insertion.

2 commentaires

Cela ressemble à cela fonctionnerait, mais cela implique toujours de saisir manuellement le === Midfield_line_break ===. Au lieu de cela, je suis entré manuellement sur \ N et cela semble fonctionner. Merci quand même.


J'aurais dû préciser que lorsque j'ai dit "frotter", je voulais dire qu'il s'agit d'un nettoyage automatique basé sur des règles (I.E. Rejoignez la ligne suivante jusqu'à ce qu'il y ait x des virgules non évaluées / non contenues ). Je ne savais pas que votre ensemble de données était assez petit pour frotter manuellement, mais je suis content que cela ait fonctionné pour vous!



15
votes
LOAD DATA LOCAL INFILE '/tmp/php89FC0F' REPLACE INTO TABLE `ohes_flyer_products`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\r\n'

0 commentaires

1
votes

Votre fichier CSV a certaines qualités que vous pourriez être en mesure d'exploiter.

  • Le champ contenant des retours de chariot qui font pas résilier l'enregistrement sont joints entre guillemets.
  • Le retour du chariot indiquant la fin de l'enregistrement suit un enregistrement avec des données conçues dans des guillemets. Si cela est vrai pour tous les enregistrements, c'est un moyen d'éventuellement distinguer les retours de chariot de terrain à partir de terminaisons d'enregistrement.

    Connaissant cela, voici quelques éléments que vous pouvez essayer:

    1. Utilisation d'un programme tel que UltraDit (ou Notepad ++) et ses fonctions de recherche / remplacement (qui incluent Manipulation d'expression régulière):

      • Recherchez tous les retours de chariot précédés d'une guillemette et remplacez-les avec un caractère unique ou une chaîne. Je suggère le personnage de la pipe "|" Mais d'abord s'assurer qu'ils ne sont utilisés nulle part dans le fichier CSV. Celles-ci représenteront la fin de l'enregistrement.
      • Ensuite, remplacez tous les retours de chariot avec des espaces. Cela apportera vos champs avec des retours de chariots non désirés dans l'alignement avec les autres données.
      • Enfin, remplacez tous les caractères spéciaux de fin d'enregistrement avec des retours de chariot. Le résultat final que les seuls retours de chariot sont présents sont des indicateurs de fin d'enregistrement.
      • Étant donné que les retours de chariot apparaissent dans un champ inclus par un délimiteur (les guillemets), vous pouvez spécifier que le moteur d'importation ne doit interdire que le champ et enregistrer les délimiteurs dehors de citations . ( Syntaxe d'infime de données de charge MySQL ) Spécifiquement, regardez Le paramètre ci-joint par 'Char' . Étant donné que tous vos champs n'utilisent pas le délimiteur, vous devrez spécifier éventuellement . En théorie, vous devriez être capable de spécifier comment le fichier CSV est construit et n'a pas besoin de l'analyser à l'avance. Je suis de l'avis, cependant, que les rendements de la chaise en champ devraient probablement être supprimés de manière à ce que le texte s'enroule correctement lors de la sortie dans un nouveau contexte.


0 commentaires

3
votes

Peut-être que vous pourriez utiliser Fgecsv pour analyser chaque ligne CSV dans un tableau, puis vider ce tableau dans la base de données?

quelque chose sur les lignes de xxx

note 1: Code n'est pas prêt pour la production, vérifiez les injections SQL!

Note 2: Veuillez utiliser Les déclarations comme utilisez-les accéléreront beaucoup de choses (ou créent une instruction d'insertion à plusieurs lignes).

Note 3: enveloppez tout dans une transaction.


0 commentaires

0
votes

Ceci a fonctionné pour moi:

DOS:     \\\r\\\n
Old Mac: \\\r
Unix:    \\\n


0 commentaires