comment importer un fichier csv dans sybaseASE avec moins de colonnes que le champ table en utilisant le fichier de format?

J’utilise BCP pour charger des données dans la table SybaseASET sous UNIX

J’ai un fichier temp.csv avec 4 colonnes:

 name | id | attr1 | attr2 FIERA|20138|| SECOR|73328|| WELLINGTON|92413|| 

template table des template avec deux colonnes supplémentaires a été définie comme ci-dessous:

 create table template (name varchar(10), id int, attr1 varchar(5) default '', attr2 varhcar(5) default '', creation_time datetime null, active_flag char(1) null) 

fichier au format bcp.fmt :

 10.0 7 1 SYBCHAR 0 10 "|" 1 name 2 SYBINT4 0 4 "|" 2 id 3 SYBCHAR 0 5 "|" 3 attr1 4 SYBCHAR 0 5 "|" 4 attr2 5 SYBDATETIME 0 8 "|" 0 creation_time 6 SYBCHAR 0 1 "|" 0 active_flag 7 SYBCHAR 0 10 "\r\n" 0 end 

Mon but est d’importer toutes les valeurs et d’inclure le fichier temp.csv dans la table des modèles, de laisser les deux derniers champs creation_time et active_flag comme null .

J’utilise la commande:

 bcp client..template in temp.csv -F2 -f bcp.fmt -U -P -S 

Cependant, j’ai toujours eu l’erreur suivante:

 Unexpected EOF encountered in BCP data-file. bcp copy in partially failed 

J’ai vérifié mon fichier temp.csv, tout le terminateur de ligne est \r\n comme je l’ai indiqué dans le fichier fromat, pourquoi j’ai toujours une erreur EOF inattendue?

Lutte trop souvent, tout a échoué. Quelqu’un pourrait-il m’aider? Merci

=================== mettre à jour le Feb.06 =================

Merci James, je mets à jour le format de fichier en fonction de ce que vous indiquez:

 10.0 6 1 SYBCHAR 0 0 "|" 5 creation_time 2 SYBCHAR 0 0 "|" 6 active_flag 3 SYBCHAR 0 10 "|" 1 name 4 SYBCHAR 0 4 "|" 2 id 5 SYBCHAR 0 5 "|" 3 attr1 6 SYBCHAR 0 5 "\r\n" 4 attr2 

alors j’ai été invité “Numéro de colonne hôte incorrect trouvé dans le fichier de format BCP”

================================================== =========================

============ LA SOLUTION EST ICI =============

première solution:

 10.0 4 1 SYBCHAR 0 10 "|" 1 name 2 SYBCHAR 0 4 "|" 2 id 3 SYBCHAR 0 5 "|" 3 attr1 4 SYBCHAR 0 5 "\r\n" 4 attr2 

deuxième solution:

 10.0 6 1 SYBCHAR 0 10 "|" 1 name 2 SYBCHAR 0 4 "|" 2 id 3 SYBCHAR 0 5 "|" 3 attr1 4 SYBCHAR 0 5 "\r\n" 4 attr2 5 SYBCHAR 0 0 "" 5 active_flag 6 SYBCHAR 0 0 "" 6 creation_time 

Les deux fonctionnent parfaitement

Il y a quelques problèmes avec votre fichier de format.

Selon la documentation Sybase , vous devez utiliser exclusivement SYBCHAR :

Type de données du fichier hôte

Le type de données du fichier hôte fait référence au format de stockage du champ dans le fichier de données hôte , et non au type de données de la colonne de la table de firebase database.

Le SGBD connaît le type de données de ses colonnes; il ne sait pas comment le fichier d’entrée est encodé.

Rappelez-vous que le premier élément dans les lignes décrivant une colonne (3 en avant) indique la colonne dans le fichier . Votre fichier de données n’a pas de colonne 5-7. Je soupçonne que c’est le champ provoquant le message d’erreur.

Aussi, afaik 0 n’est pas un colid valide dans la table cible. Si vous voulez indiquer NULL pour une colonne particulière, dites qu’elle commence au début et n’a pas de longueur,

 1 SYBCHAR 0 0 "|" 7 active_flag 

Enfin, il n’est pas nécessaire de prendre en compte le terminateur de ligne dans le fichier de format. Vous faites cela sur la ligne de commande bcp avec l’option -r . Si vous utilisez Windows, IIRC qui deviendrait

 bcp client..template in temp.csv -F2 -f bcp.fmt -r \r\n -U -P -S 

Bien sûr, sous Linux, vous devez citer ou échapper aux barres obliques inverses.

Edit: pour plus de clarté, voici à quoi devrait ressembler votre fichier,

 10.0 6 1 SYBCHAR 0 0 "|" 5 creation_time 1 SYBCHAR 0 0 "|" 6 active_flag 1 SYBCHAR 0 10 "|" 1 name 2 SYBCHAR 0 4 "|" 2 id 3 SYBCHAR 0 5 "|" 3 attr1 4 SYBCHAR 0 5 "" 4 attr2 

Si cela ne fonctionne pas, vous devrez trouver quelqu’un qui, euh, connaît la réponse. Je n’ai pas de système à scope de main pour tester.

Rien n’empêche qu’une partie du fichier de données soit mappée à plusieurs colonnes. Dans le champ 1 de votre fichier de format, vous mentionnez les colonnes 5 et 6 du fichier de données, mais votre fichier de données ne comporte que 4 colonnes. Je pense que c’est ce que le message d’erreur vous dit.

Voulez-vous dire que tous les types de données que j’ai mis dans un fichier de format doivent être “SYBCHAR”

Oui. Le fichier de format peut décrire des fichiers texte ou binarys. Votre fichier est du texte, toutes vos données (dans le fichier) sont SYBCHAR .