Précédent   Forum des professionnels en informatique > Bases de données > Sybase > Outils
Outils Forum d'entraide sur toutes les autres solutions applicatives de Sybase n'ayant pas leur forum propre
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/04/2008, 19h31   #1
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut [bcp in] Format de date pour les champs

Bonjour à tous,

je cherche à bcp_in un fichier txt dans lequel j'ai des champs de type date

Dans mon fichier txt mon format date est de type 123 : yyyy-mm-dd THH:mm:sss

Dans ma table d'import mon format date est de type Défault + milliseconds soit 109 et s'écrit donc : mon dd yyyy hh:mm:sss AM (or PM)

Les solution communément proposées semble être de passer par une table temporaire pour récupérer mes champs sous sybase puis utiliser convert dans sybase pour modifier le format ou encore de modifier les options de sybase ou encore modifier les paramètres régionaux de l'OS, etc... etc...

Or je souhaite écrire un .BAT qui ne passe pas par tout ce mic mac et utilise uniquement l'outil bcp !

Y-a-til une solution (option) pour paramètrer bcp_in afin qu'il convertisse de lui même le format 123 de mon txt en 109 pour remplir les champs de ma table ?

Merci pour toute information ou piste d'information
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 12h44   #2
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut Suite ...

Une idée m'est venue : utiliser un format de fichier !

La manière la plus simple de le créer me semble être de lancer mon bcp_in sans option de format afin d'accéder au prompt.

Je laisse alors les attributs par défaut des champs qui ne sont pas des dates.
J'indique pour tout les champs date mon format.
Si ça tourne je sauvegarde le tout lorsque bcp m'indique : "Do you want to create a file format ?"

Dès lors (si tout roule) je peux lancer un .BAT qui se référe à ce file format.

Toutefois j'ai un problème :

Quand bcp me demande le type à associé aux champs correspondant au date (par défaut smalldatetime) j'aimerai pouvoir lui indiquer la syntaxe particulière de mon champ. J'ai essayé une tournure utilisée par LOAD TABLE à savoir DATETIME('yyyy-mm-dd HH:mm:sss') et beaucoup d'autres choses encore et ma fois rien ne fonctionne.

Au vu de ce post et du précédent auriez-vous une idée... une piste...
Peut-être devrais utiliser les codes de format date ODBC (dans mon cas 109 et 123) ? Je ne sais pas trop où chercher... MERCI.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2008, 15h53   #3
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut Post pour faire "remonter mon message"

Personne n'a la moindre idée pour me sortir de là ?

J'aimerai assez me passer de l'écriture d'un prog en C pour convertir dans le bon format les dates de mon txt.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 12h01   #4
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Hmmm...

Quelle version d'ASE?

Je viens de tester avec 15.0.2:

Code :
1
2
 
CREATE TABLE bcp_t(id int, dt datetime)
Code :
1
2
3
4
5
6
7
8
 
[mpeppler@pep ~]$ cat bcp.t
1       2008-01-01 T08:05:20
[mpeppler@pep ~]$ bcp my_db2..bcp_t IN bcp.t -Usa -P -SLOCALHOST -c
 
Starting copy...
 
1 rows copied.
Et dans la table, j'ai:

Code :
1
2
3
4
5
6
7
 
[33] 192.168.174.128 5010.my_db2.(sa).1> SELECT * FROM bcp_t;
 id          dt
 ----------- -------------------
           1 Jan  1 2008  8:05AM
 
(1 row affected)
Donc bcp a correctement interprété la date ISO au moment de l'insert.

Version de bcp:
Code :
1
2
3
 
[mpeppler@pep ~]$ bcp -v
Sybase CTBCP Utility/15.0/P-EBF14165 ESD #7/DRV.15.0.3/Linux Intel/Linux 2.4.21-47.0.1.ELsmp i686/BUILD1500-093/OPT/Wed Dec 13 21:49:08 2006
Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 14h40   #5
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut A voir....

Salut,

tout d'abord merci pour le post.

Comme tu es peut-être encore en visite sur le site je voulais te demander comment faire pour voir la version ASE.
J'ai fait un bcp -v et les copiright sont pas tout jeune (87 et 98), je n'arrive pas pour le moment à en savoir plus sur la version bcp.

Quoiqu'il en soit je vais regarder tout ça de plus près (en faisant du pas à pas avec un petit fichier de texte -- comme tu l'as fait). En réalité mes dates dans mon fichier texte sont sous la forme suivante :

2007-05-15 17:27:00.0

Je vais donc essayer de les mettre exactement au format que tu as utilisé avant d'aller plus loin. A savoir : 2008-01-01 T08:05:20

A quoi sert le T (c'est pour Time ? ) (je croyais que ce n'était qu'une sorte de décoration inutile). Ensuite je verrai si je peux rajouter la gestion des millisecondes et me passer du T.

Je pense que je posterai demain (Mardi) ou Mercredi pour donner du nouveau (en ce moment je suis sur quelque chose que je ne peux repousser) et ma fois ce post est fait pour que le prog soit plus générique (donc ça peux attendre encore 24 H).

D'ici là n'hésite pas à me donner des infos sur le "T", son histoire et la norme ISO pour les dates.

Voili voilou...
Encore merci pour la réponse très claire.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 14h46   #6
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut version bcp

OK,
pour ce qui est de la version de bcp c'est 11.1.1 pour moi. Je vais essayer de voir si on peut la mettre à jour.

J'avais mal lu ton post décidément très très clair.

Encore merci.
Je débute est c'est pas tout les jours facile.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 15h22   #7
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Pour info - la version d'ASE:

Une version de bcp plus récente avec un ASE plus ancien pourrait ne pas marcher mieux que ta version actuelle. Si c'est le cas, je suggère un petit script perl pour mettre la date dans un format compréhensible par bcp/ASE.

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 15h28   #8
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut [bcp in] :: problème de version ?

Bonjour,

j'ai eu un peu le temps de me pencher sur le problème.

Ma version de ASE est la 12.5.4 :
Code :
Adaptive Server Enterprise/12.5.4/EBF 14065 ESD#3/P/Sun_svr4/OS 5.8/ase1254/2030/64-bit/FBO/Sat Oct 14 07:19:31 2006
Ma version de bcp est 11.1.1 :

J'ai réalisé le petit test solution dont tu m'as parlé mais rien n'y fait j'ai un message explicite qui indique un problème de conversion. C'est sûrement du au date car quand j'enlève les champs qui s'y rapportent dans mon txt les erreurs sont levées et je récupére bien mes données sous Sybase.

Du coup, comme je ne suis pas admin sur ma machine (et que je ne risque pas de mettre à jour mon ASE avant un moment je pense), j'avais dans l'idée de créer un code C pour la conversion afin de générer un executable du type conversion_date.exe. Puis enfin d'inclure le tout dans un .BAT.

Toutefois, tu m'indiques que Perl se prette parfaitement à ma tache. Peux-tu m'en dire plus.

Enfin, y-a-t-il des solutions de type "mise à jour" ou "update" pour passer à la dernière version de ASE ou bien doit-on tout réinstaller ?

Cordialement,

Enfin une petite question de débutant : c'est quoi cette ligne :

Code :
192.168.174.128 5010.my_db2.(sa).1> SELECT * FROM bcp_t;
Je comprends bien ce que ça fait mais sous quel environnement es-tu ?
En ligne de commande ?

J'utilise SQL advantage (très peu pratique) et je ne serai pas contre un changement.

Bonne journée.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2008, 12h15   #9
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Citation:
Envoyé par VASAPANCH Voir le message
Bonjour,

Ma version de ASE est la 12.5.4 :
Code :
Adaptive Server Enterprise/12.5.4/EBF 14065 ESD#3/P/Sun_svr4/OS 5.8/ase1254/2030/64-bit/FBO/Sat Oct 14 07:19:31 2006
Ma version de bcp est 11.1.1 :
La version de bcp dépend de ton code client. Pour le mettre à jour il faut mettre à jour le client sur ton poste Windows, ce qui se fait en réinstallant le SDK (soft. dev. kit) ou le package pcclient (qui est normalement livré avec ASE).

Citation:
Toutefois, tu m'indiques que Perl se prette parfaitement à ma tache. Peux-tu m'en dire plus.
perl permet de facilement faire du traitement de chaine de caractères. Si tu poste une ligne de ton fichier BCP source on peut probablement assez facilement faire un bout de script qui le met dans la bonne forme.

Citation:
Enfin une petite question de débutant : c'est quoi cette ligne :

Code :
192.168.174.128 5010.my_db2.(sa).1> SELECT * FROM bcp_t;
Je comprends bien ce que ça fait mais sous quel environnement es-tu ?
En ligne de commande ?
J'utlilise sqsh (www.sqsh.org) - dans ce cas sous Cygwin.

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 10h24   #10
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut Initiation Perl

Bonjour,

et merci pour toutes ces infos.

Pour l'instant, je n'ai pas forcément beaucoup de priviléges sur ma machine et donc la réinstallation du SDK, ou la mise à jour de Sybase n'est pas prévue pour demain.

De ce fait, un script (ou bout de script) perl qui me permette de comprendre les fondamentaux et pourquoi pas de me lancer sur ce langage pourrait fortement m'intéresser.

Supposons (ce qui est le cas) que j'ai un fichier source du type :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
5614	4034784	2007-05-15 17:27:00.0
5614	4034791	2007-05-15 17:28:00.0
5614	4034792	2007-05-15 17:29:00.0
5614	4034793	2007-05-15 17:30:00.0
5614	4034794	2007-05-15 17:31:00.0
5614	4034817	2007-05-15 17:32:00.0
5614	4039304	2007-05-15 17:32:00.0
5614	4039307	2007-05-15 17:33:00.0
5614	4039308	2007-05-15 17:34:00.0
5614	4039324	2007-05-15 17:35:00.0
Je sais que ma version bcp peut traiter les fichiers du type suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
5614	4034784	May 15 2007 5:27PM
5614	4034791	May 15 2007 5:28PM
5614	4034792	May 15 2007 5:29PM
5614	4034793	May 15 2007 5:30PM
5614	4034794	May 15 2007 5:31PM
5614	4034817	May 15 2007 5:32PM
5614	4039304	May 15 2007 5:32PM
5614	4039307	May 15 2007 5:33PM
5614	4039308	May 15 2007 5:34PM
5614	4039324	May 15 2007 5:35PM
J'avais pensé faire un petit exe (en utilisant du C) pour faire la transfo mais peut-êter qu'un script perl serait plus adapté.

Je n'ai pas trop (pas du tout) de connaissance sur le sujet.
Faut-il un compilateur pour perl ? Crée-t-on un exe ou est-ce juste un script ?

Encore merci pour les infos.

PS pour mpeppler : jettes un coup d'oeil à tout ça si tu as le temps mais ne t'embettes pas trop car la priorité de ce boulot a fortement diminué. En fait tout ça m'intéresse dans le sens où j'ai quelques connaissances précises en C, C++ etc... mais pas sur les bases de données.
Après avoir travaillé sur Sybase, bcp, etc.... je bosse maintenant en parallèle sur PostGre SQL et j'ai de gros soucis à la compil de l'API C (libpq.dll) de PostGre.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 13h14   #11
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Voici un petit script de conversion:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
#!/usr/bin/perl
 
USE strict;
 
while(<>) {
	chomp;
	my @row = split(/\t/, $_);
	IF($row[2] =~/(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/) {
		$row[2] = format_date($1, $2, $3, $4, $5);
	}
	LOCAL $" = "\t";
	print "@row\n";
}
 
sub format_date {
	my ($year, $mon, $day, $hour, $min) = @_;
	my %months = (1 => 'Jan', 2 => 'Feb', 3 => 'Mar', 4 => 'Apr', 5 => 'May', 6 => 'Jun', 
	                7 => 'Jul', 8 => 'Aug', 9 => 'Sep', 10 => 'Oct', 11 => 'Nov', 12 => 'Dec');
	my $ampm = 'AM';            
	if($hour > 13) {
		$hour -= 12;
		$ampm = 'PM';
	}
 
	return "$months{$mon} $day $year $hour:$min$ampm";
 
}
Ce qui donne:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$ perl ../perl/test2.pl <DATA.dat
5614    4034784  15 2007 5:27PM
5614    4034791  15 2007 5:28PM
5614    4034792  15 2007 5:29PM
5614    4034793  15 2007 5:30PM
5614    4034794  15 2007 5:31PM
5614    4034817  15 2007 5:32PM
5614    4039304  15 2007 5:32PM
5614    4039307  15 2007 5:33PM
5614    4039308  15 2007 5:34PM
5614    4039324  15 2007 5:35PM
Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2008, 16h01   #12
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut Merci beaucoup.

Merci pour le script...

J'ai voulu tester rapidement mais je n'ai même pas perl d'installé sur mon poste et il me faut contacter le support pour l'avoir.

Du coup je pense que je reposterai d'ici 10/15 jours pour te dire si tout est OK (c'est la moindre des choses).

Pour le moment je suis dans le jus concernant un produit à livrer sous peu mais quand je vois la concision du script je me dis que ça vaut le coup d'y jeter un regard tranquille.

Par contre n'as-tu pas un problème avec "la fonction" (je ne sais pas trop comment on appelle cela) months{$mon} car dans le résultat je ne vois pas le mois s'afficher alors que dans le script je "sens" bien que tu gère le problème à l'aide d'une sorte de SWITCH CASE :
1 => 'Jan', 2 => 'Feb', etc...

A la limite ne m'en dit pas plus pour le moment, ça me laissera le temps de me pencher un peu sur le sujet...

Encore merci pour ta disponibilité.
C'est vraiment super sympa de ta part !
J'essaierai de renvoyer l'ascensceur à un autre étage un de ces 4 mais pour l'instant mes connaissances limitées ne me le permettent pas ;-)
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2008, 16h52   #13
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Bien vu!

%months est un tableau associatif. La clé est $mon, qui vient de la ligne source et est de la forme 05 (pour mai). Donc l'initialisation de %months doit être modifiée:

Code :
1
2
3
 
	my %months = ('01' => 'Jan', '02' => 'Feb', '03' => 'Mar', '04' => 'Apr', '05' => 'May', '06' => 'Jun', 
	               '07'=> 'Jul', '08' => 'Aug', '09' => 'Sep', 10 => 'Oct', 11 => 'Nov', 12 => 'Dec');
Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2008, 12h00   #14
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut Compilateur VASAPANCH

Encore merci pour ta disponibilité mpeppler !

Je crois qu'au vu de ces posts on peut te décerner le prix de la réactivité !

En attendant que le support m'installe perl, je vais télécharger un ou deux cours d'introduction. C'est vrai que pour manier les chaînes de caractère où faire des petits scripts utilitaires ça à l'air assez sympa.

Et je reposte dès que j'ai pu faire mon fichier BAT d'import de manière générique en intégrant ton script.

PS : pas forcément cette semaine car j'ai encore un peu d'huile sur le feu par ailleurs...
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2008, 12h02   #15
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut Zut

Excuse-moi Michael j'avais pas vu que t'avais un prénom !
Donc merci Michael.
C'est quand même mieux comme ça...
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h04.


 
 
 
 
Partenaires

Hébergement Web