Précédent   Forum du club des développeurs et IT Pro > Bases de données > Autres SGBD > Informix
Informix Forum d'entraide Informix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/01/2010, 07h05   #1
fastlane3000
Invité de passage
 
Inscription : janvier 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 9
Points : 4
Points : 4
Par défaut Intégration d'un fichier plat dans la base

Bonjour!

j'ai des fichiers plats de 200 Mo chacun et qui contiennent des champs que j'aimerais intégrer, voilà je suis sous informix v10 avec un OS AIX 5.3.

les champs en questions n'ont pas de délimiteurs particuliers il y a quelques blancs mais seulement entre un ou de plusieurs datas et la séquence se répète jusqu'à la fin du fichier par contre leur position s'incrémente d'une manière régulière avec une longueur fixe (par exemple un champ1 a la position 1-3 51-53 101-103.... etc notez que l'itération est de 50)

ce qui donne quelque chose comme ça

champ1champ2ESPACEchamp3champ4champ5ESPACEchamp6ESPACEESPACEchamp1champ2ESPACEchamp3champ4champ5ESPACEchamp6ESPACEESPACEchamp1...etc

je veux avoir toutes les occurrences de champ1,...champ6 dans une table (chp1,chp2,chp3,chp4,chp5,chp6)
ie occurrences de champ1 dans chp1
occurrences de champ2 dans chp2
......etc

avec conversion de certains champs genre champ2 de char(6) sous forme "aammjj" à date "mm/jj/aaaa" et champ4 de char(12) à décimal(12,2)

j'ai posé la question sur la section "AIX" si je pouvais changer le format de mon fichier afin de créer un fichier
.unl
mais je me demandais s'il y avais un moyen de faire ça directement par SQL et Informix puisque mon but final est une integration vers ma base

Merci d'avance pour vos réponses
fastlane3000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2010, 22h58   #2
IFA2377
Membre habitué
 
Inscription : novembre 2007
Messages : 108
Détails du profil
Informations personnelles :
Âge : 65
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2007
Messages : 108
Points : 121
Points : 121
Par défaut Quelques pistes

Bonjour,

Pour te constituer un fichier de type « .unl », il y a deux problèmes :

1. Reconstituer un fichier d’items de 50 caractères à loader dans une table d’un seul champ char(50).

Ces fichiers ne seraient-ils pas issus du monde micro ? Si c’est le cas, il doit être possible de recréer des fichiers constitués d’items de 50 caractères. Le transfert par FTP n’a peut-être pas été réalisé comme il aurait fallu. Sur AIX, la commande « d2x » permet de transformer un fichier « DOS » en fichier « Unix ». Il doit y avoir un problème LF/CR-LF.

2. Exécuter une commande SQL sur cette table pour unloder un fichier avec des séparateurs « pipe ».

Il est aussi possible de traiter d’abord ces fichiers en format « texte » sur PC tout simplement avec Excel.

a. Ouvrir le fichier « texte » et déterminer la largeur des colonnes
b. Ajout d’une colonne « pipe » après chaque colonne
c. Affecter aux cellules de la colonne « numérique » char(12) le format numérique avec deux décimales
d. Sauvegarde en « .txt »
e. Transfert vers l’AIX
f. Traitement du champ date, etc.
IFA2377 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 21h36   #3
fastlane3000
Invité de passage
 
Inscription : janvier 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 9
Points : 4
Points : 4
Bonjour,

merci pour la réponse
Citation:
Envoyé par IFA2377 Voir le message
1. Reconstituer un fichier d’items de 50 caractères à loader dans une table d’un seul champ char(50).
c'est justement ce que mon patron m'a conseillé de faire, mais j'ai trouvé mieux
Citation:
Envoyé par IFA2377 Voir le message
Ces fichiers ne seraient-ils pas issus du monde micro ? Si c’est le cas, il doit être possible de recréer des fichiers constitués d’items de 50 caractères. Le transfert par FTP n’a peut-être pas été réalisé comme il aurait fallu. Sur AIX, la commande « d2x » permet de transformer un fichier « DOS » en fichier « Unix ». Il doit y avoir un problème LF/CR-LF.
en fait c'est des fichiers copiés à partir de sauvegardes sur bande magnétique, je suis sur un projet de mise en place d'un serveur d'archivage et on s'occupe de récupérer ces données afin de pouvoir les stocker sur une base Informix
Citation:
Envoyé par IFA2377 Voir le message
2. Exécuter une commande SQL sur cette table pour unloder un fichier avec des séparateurs « pipe ».
c'est justement mon but et c'est pour cette raison que je cherche à créer un UNL
Citation:
Envoyé par IFA2377 Voir le message
Il est aussi possible de traiter d’abord ces fichiers en format « texte » sur PC tout simplement avec Excel.
a. Ouvrir le fichier « texte » et déterminer la largeur des colonnes
b. Ajout d’une colonne « pipe » après chaque colonne
c. Affecter aux cellules de la colonne « numérique » char(12) le format numérique avec deux décimales
d. Sauvegarde en « .txt »
e. Transfert vers l’AIX
f. Traitement du champ date, etc.
en fait c'est comme qu'on fais actuellement au boulot, mais là j'ai des fichiers annuels qui font dans les 200Mo et le traitement avec Excel est vraiment pénible si ce n'est quasiment infaisable car ça fait planté le PC.

En réalité depuis la dernière fois j'ai trouvé une solution d'abord le découpage de la ligne par 50 caracteres avec "dd"
Code :
dd cbs=50 ibs=50 obs=50 IF=fichier_a_traiter ofs=fichier_decoupe conv=unblock
et c'est plutot rapide, il traite un fichier avec un peu moins d'une minute !
Ensuite la transformation de fichier_decoupe en fichier.unl :
là j'ai utilisé awk avec sa sous-fonction "substr" pour inserer les pipes en rajoutant une conversion de type, il me manque encore le traitement des lignes erronées
Code :
awk -f trans_unl.awk fichier_decoupe > fichier.unl
Voilà dès que j'aurai complété mon shell "awk" je pourrais charger ma table avec un "load" ou "dbload"

Merci pour tout IFA2377
fastlane3000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2010, 18h57   #4
IFA2377
Membre habitué
 
Inscription : novembre 2007
Messages : 108
Détails du profil
Informations personnelles :
Âge : 65
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2007
Messages : 108
Points : 121
Points : 121
Par défaut Et le champ date ?

Bonjour,

Et ton champ date ? Avec l'année sur deux chiffres. Au load, Informix va les considérer "1900". Non ?

Si tu rencontres le problème, j'ai un petit SQL qui rétablit ça. Mais peut-être n'as-tu que des dates "2000".
IFA2377 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2010, 19h12   #5
fastlane3000
Invité de passage
 
Inscription : janvier 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 9
Points : 4
Points : 4
Citation:
Envoyé par IFA2377 Voir le message
Bonjour,

Et ton champ date ? Avec l'année sur deux chiffres. Au load, Informix va les considérer "1900". Non ?

Si tu rencontres le problème, j'ai un petit SQL qui rétablit ça. Mais peut-être n'as-tu que des dates "2000".
salut,

en fait dans mon script trans_unl.awk j'ai défini des fonctions
pour la date c'est en gros comme ceci que j'ai proceder
mon champ date est sous la forme aammjj

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#! /usr/bin/awk
{
.....
an=substr($0,position_an,2)
mois=substr($0,position_mois,2)
jour=substr($0,position_jour,2)
an=conv_an_de_2_a_4(an)
print ......jour"/"mois"/"an.....
...
}
....
FUNCTION conv_an_de_2_a_4(s){ 
IF (s>=70) {s="19"s} # si année après 1970 (j'ai pas de fichiers anterieur à 1970
else {s="20"s} ; # pour les années apres 2000 (c'est vrai que ça peut aller qu'en 2069)
RETURN s}
......
}
voilà mais si t'as des années qui vont jusqu'en 1960 tu choisis de comparer avec 60 enfin c'est selon tes fichiers
je rajoute juste qu'avec awk la concaténation se simplement en mettant deux valeur l'une à côté de l'autre.

sinon si tu veux faire la conversion avec informix il y a la fonction to_date (que je n'ai pas réussi à faire marcher et vu que j'ai trouvé une meilleure solution )

si tu veux il y a le site officiel d'IBM pour les fonctions temporelles:

http://publib.boulder.ibm.com/infoce...c/sqls1108.htm

mais je crois savoir que pour une année sur 2 position c'est %iY au lieu de %Y qui est utilisé pour "aaaa"
fastlane3000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 10h42   #6
begooden-it
Membre habitué
 
Homme Eric Vercelletto
Achitecte Informix SGBD et applications
Inscription : octobre 2010
Messages : 84
Détails du profil
Informations personnelles :
Nom : Homme Eric Vercelletto
Âge : 53
Localisation : France, Finistère (Bretagne)

Informations professionnelles :
Activité : Achitecte Informix SGBD et applications
Secteur : Conseil

Informations forums :
Inscription : octobre 2010
Messages : 84
Points : 133
Points : 133
Bonjour,

un peu tard une fois de plus, mais je viens proposer des solutions un peu plus officielles et simples.

Si tu es en IDS < 11.50xC6, il existe depuis la première version d'Informix un utilitaire qui s'appelle dbload, et qui est complètement fait pour ce que tu veux faire.
dbload permet de traiter des fichiers ASCII
* soit en format fixe: exactement comme tu veux faire: champ1 est représenté par la position de 1 à 15 par exemple, le champ 2 position 18 à 23 etc....
* soit en format délimité, par le caractère que tu lui indiqueras ( | par défaut).

L'utilisation du format fixe est très versatile, avec notamment possibilité d'effectuer des recouvrements de positions ( ex champ1 pos 1à15, champ 2 pos 3à7), et ton script est très facile à maintenir.
L'autre avantage de dbload est la rapidité: il utilise des CURSOR FOR INSERT qui bufferisent les données au niveau du client.
Autre avantage est le contrôle des longues transactions: tu peux limiter de nombre d'INSERTS par commit work, évitant ainsi d' "attraper" une longue transaction au bout de 15mn ou plus.

Si tu es en IDS >=11.50 UC6, utilise les tables externes, fonctionnalité provenant de Informix XPS, serveur de Data WareHouse. Tu crées une "external table"qui mappe ton fichier ascii avec la description que tu lui fourniras, comme tu l'aurais fait avec dbload.
Avantages:
* tu manipule ton fichier avec du sql, c'est devenu une table de ta base.
* la performance: il existe un mode ( express) où les INSERT sont exécutés en direct, sans passer par les BUFFERS de Shared Memory: tu atteins alors la performance d'un data loader pour Datawarehouse. sympa non?
cherche sur le net "informix CREATE EXTERNAL TABLE"

Eric
begooden-it est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h07.


 
 
 
 
Partenaires

Hébergement Web