Copie PostgreSQL de CSV avec valeurs de données manquantes

j'essaie d'importer un fichier CSV dans PostgreSQL en utilisant COPY. Il s'étouffe quand il frappe une rangée où il y a des valeurs vides, par exemple la deuxième rangée ci-dessous:

JAN-01-2001,1,2,3,4,5

JAN-02-2001,6,7,,

j'ai essayé cette instruction de copie, ainsi que des variantes utilisant NULL et QUOTE et je n'ai rien trouvé qui fonctionne.

copier les données à partir des données.dat' UTILISATION DE DÉLIMITEURS"," CSV;

des suggestions? Le fichier de données est dans un énorme fichier plat de 22 Go, donc je voudrais éviter de l'éditer directement.

16
demandé sur ugh 2011-12-01 23:36:55

5 réponses

je suggère de convertir vos colonnes numériques en colonnes de texte pour les besoins de votre importation. La raison en est qu'une chaîne vide n'est pas une valeur numérique valide. Changez vos colonnes numériques en colonnes de texte, importez le fichier CSV, mettez à jour les valeurs vides à null ou 0, puis changez la colonne de nouveau à un entier.

2
répondu Kenaniah 2011-12-02 23:47:34

Avec une question comme que vous devez toujours inclure des informations sur votre système d'exploitation et numéro de version de PostgreSQL.

Votre déclaration est suspect:

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;

DELIMITERS a été utilisé dans les versions avant 7.3. Il est toujours supporté afin de ne pas casser l'ancien code, mais ne l'utilisez plus. Le bon mot-clé est DELIMITER. Et vous n'avez pas besoin de spécifier , tout comme il est la valeur par défaut de FORMAT CSV.

Aussi, je cite l' manuel ici:

nom du fichier

Le chemin d'accès absolu du fichier de sortie. Les utilisateurs de Windows peuvent avoir besoin d'utiliser une chaîne E" et doubler tous les antislashs utilisés dans le nom de chemin d'accès.

Donc, votre 'data.dat' doit être quelque chose comme '/path/to/data.dat' sur UNIX ou E'C:\path\to\data.dat' sur les fenêtres.

pour les versions 7.3+ utiliser:

COPY data FROM '/path/to/data.dat' CSV

Pour Version 9.0 + use:

COPY data FROM '/path/to/data.dat' (FORMAT CSV)

Si vous obtenez toujours cette erreur:

ERROR: invalid input syntaxe de type numérique: CONTEXTE: COPIE des données, ligne 13, colonne interval_2400:

alors, évidemment, le fichier source ne correspond pas à la structure de la table data. Jetez un coup d'oeil à votre fichier source, allez à la ligne 13 et voyez quelle valeur y a-t-il pour la colonne interval_2400. Il y a des Chances que ce ne soit pas numérique. Vous pouvez soit fixer le fichier source ou adapter la définition de la table:

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text;

ou ce qui est le plus approprié. Peut-être interval, à en juger par le nom.

2
répondu Erwin Brandstetter 2012-09-30 19:54:31

C'est PostgreSQL bug - csv analyseur ignorer dernier item vide et de le jeter erreur "PG::BadCopyFileFormat: ERREUR: données manquantes pour la colonne".

je vais utiliser un stupide hack:

si le dernier élément est vide, ajoutez simplement un délimiteur à la fin de la chaîne:

1,2,3
1,2,,

cet ajout a manqué le dernier élément dans la rangée pour importer des données.

0
répondu Sergio Belevskij 2016-12-06 03:49:23

une mise en garde supplémentaire - cochez le numéro de ligne de l'erreur et assurez-vous qu'il ne s'agit pas d'une ligne vierge dans le fichier CSV. Cela va provoquer postgres de jeter la même erreur sur les valeurs manquantes.

0
répondu glyph 2017-02-11 07:35:39

quiconque vient ici avec des fichiers plus petits: voici la solution la plus facile que j'ai trouvée à cela et le nombre incohérent de délimiteurs dans un csv.

  1. ouvrez votre CSV.
  2. Ctrl + Maj + 8 (sélectionne toutes les données)
  3. Ctrl + h (Open find replace)
  4. laisser la boîte de recherche vide de sorte qu'elle cherche des chaînes de 0 Longueur.
  5. inscrivez un espace dans la case remplacer par.

cela va boucler tout le CSV et le forcer à avoir le nombre de colonnes correct dans les délimiteurs (,) même s'il n'y a pas de données dans cette colonne.

si vous êtes d'accord avec Excel, vous pouvez le transformer en macro aussi, donc ma macro (Ctrl + g) le fait d'un seul coup. Création d'une Macro

-1
répondu Lewis 2015-11-05 14:51:35