IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Outils Sybase Discussion :

[bcp in] Format de date pour les champs


Sujet :

Outils Sybase

  1. #1
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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

  2. #2
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Hmmm...

    Quelle version d'ASE?

    Je viens de tester avec 15.0.2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create table bcp_t(id int, dt datetime)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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.

  6. #6
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    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

  8. #8
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Citation Envoyé par VASAPANCH Voir le message
    Bonjour,

    Ma version de ASE est la 12.5.4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

    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.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  10. #10
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Voici un petit script de conversion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  12. #12
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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 ;-)

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  14. #14
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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...

  15. #15
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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...

Discussions similaires

  1. Intégrer des calendriers pour les champs de saisie des dates
    Par xaviermfx dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 25/07/2012, 00h21
  2. Nouvelles Dates pour les Formation Nokia Windows Phone
    Par jamouroux dans le forum Windows Phone
    Réponses: 32
    Dernier message: 24/02/2012, 17h39
  3. utiliser le calendrier pour les champs date
    Par montassar.nizar dans le forum JDeveloper
    Réponses: 3
    Dernier message: 17/08/2008, 14h31
  4. Réponses: 3
    Dernier message: 12/12/2007, 15h35
  5. Equivalent de (*) pour les champs date et num
    Par pursang25 dans le forum Access
    Réponses: 3
    Dernier message: 11/07/2006, 21h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo