livinho38
Messages postés29Date d'inscriptionlundi 21 avril 2008StatutMembreDernière intervention24 juillet 2009
-
21 juil. 2009 à 13:43
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 2010
-
24 juil. 2009 à 11:41
Bonjour
je dispose de plusieurs fichiers CSV, pr favoriser les futures requete il esdt interessant de lier les tables en fonctions de date.
Cependant dans mon fichier CSV la date se trouve dans 3 colonnes, jour ,mois,année,
la colonne mois est de la forme suivante: Jan. ; Fév. ; Mars ; ...
j'ai donc créé une table mois contenant 2 colonne: Id_mois ; mois
pour pouvoir faire le lien entre le nom du mois et son numéro.
j'aimerai donc kan je recupere mes données du fichier CSV, transformer le mois en numéro grace à cette table (mais coment?), mais aussi pour facilité les requete en fonction des date, mettre dans une seule colonne jour/mois/année.
est-ce possible et si oui comment?
je vous remercie pour votre aide. je débute en SQL server et je galere bien
Olivier
livinho38
Messages postés29Date d'inscriptionlundi 21 avril 2008StatutMembreDernière intervention24 juillet 20091 22 juil. 2009 à 16:03
je comprend ce que tu dit,
mais la ou je taf, absolument personne je sais programmer, faire des requete SQL etc etc,
donc il est beaucoup plus simple de récuperer ces données pour creer mon entrepot de données.
Pour le moment j'analyse donc comment il est possible de récuperer ces données afin de creer le datamart, par la suite ils leur faudra faire des rapport grace aux données du datamart.
donc jen suis a la premiere etape, récuperation des données, ensuite je devrai voir comment automatiser tout ça de maniere journalier,
de maniere a avoir un entrepot de données complet et automatisé
maintnena oui SQL server est un outil que je découvre et il y a bcp de chose ke je ne comprend pas. j'arrive a récuperer les données dans des tables, apres entre les données a modifier, les données a seulement rajouter (eviter les doublon) etc etc, c vrai que je galère pas mal. c'est pour ça que je suis la.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 21 juil. 2009 à 14:56
A ta place je chercherais du coté de la puissante fonction CONVERT et du flag 107 qui vas avec.
Voici un exemple que je viens de faire sur mon serveur de test :
create table DATE_TEST (Jour char(2), mois char(50), année char(4));
mon jeu de test :
05 mai 2008
05 juillet 2008
05 janvier 2008
05 janv 2009
Requete 1 :
select convert(datetime, mois + ' '+ jour + ',' + année, 107) from DATE_TEST;
Resultat 1 me rendant un type DATETIME (plus facile a manipuler ultierieurement) :
2008-05-05 00:00:00.000
2008-07-05 00:00:00.000
2008-01-05 00:00:00.000
2009-01-05 00:00:00.000
Requete 2 :
select convert(varchar,convert(datetime, mois + ' '+ jour + ',' + année, 107),103) from DATE_TEST;
Me rendant un type Varchar :
05/05/2008
05/07/2008
05/01/2008
05/01/2009
Je pense qu'avec ca tu devrais t'en sortir.
Vous n’avez pas trouvé la réponse que vous recherchez ?
livinho38
Messages postés29Date d'inscriptionlundi 21 avril 2008StatutMembreDernière intervention24 juillet 20091 22 juil. 2009 à 09:49
Merci de ta réponse,
mais je vois pas trop comment utilisé sa, en fait je réexplique le contexte:
je dispose de plusieurs fichiers CSV, ceux ci dispose tous de date découper en plusieurs colones :
Jour: 25 | Mois: Oct. | Année : 2008 | Trimestre : Q.4 | Semaine calentaire : Semaine 43 | Jour de l'année: 299 |
j'ai alors creer une table Mois contenant 2 colonne : Id_mois : 1 | mois : Janvier
sous studio je recupere un fichier plat (mon csv) je converti les données, je fait une recherche sur la case mois afin de récuperer l'id correspondant,
je sais pas si c'est une bonne méthode, qu'en pensez vous? mais j'obtien bien un mois en int.
maintenna , pour facilité les requete ultérieur , il me faudrait une date au format date JJ/MM/AAAA dans une colonne.
J'ai donc l'idee de creer une table Date qui contient les données cité tout en haut, ET une colonne date du format JJ/MM/AAAA. mais je ne sais pas comment creer et instancier cette colonne
je dois utiliser Studio puisque je dois realiser des pakage qui seront lancer chaque jour.
est-ce clair? est-ce que je part dans la bonne direction? tes requete ci dessus sont elles adaptable ? cela fait beaucoup de question mais j'ai beaucoup de pb ^^
merci bcp d'avance.!
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 22 juil. 2009 à 10:22
Pour moi tu fais totalement fausse route et tu te complique terriblement la vie.
Un fichier CSV est un fichier normé, typiquement le type de fichier que tu peux inséré dans une table temporaire via la commande BULK INSERT !
Une fois dans ta table temporaire tu peux commencer par nettoyer tes données (en enlevant le . a la fin de l'abreviation du mois, je te laisse chercher par toi meme les fonction de traitement de chaine de caractere)
Une fois ces données propres tu les transforme vial le type de code que je t'ai donné, et tu les insert dans une table définitive sous la forme de ton choix !
Sequence :
Create table #tempCSV (mescolonnes du fichier CSV...)
BULK INSERT #tempCSV FROM FILE='monfichier.csv' WITH ... (description du fichier, séparateur, fin de ligne)
UPDATE #tempCSV SET macolonne1 = fnc(macolonne1), ...(traitement des colonnes)
insert into MaTableDefinitive
select fnc(macolonne1 + macolonne3), ... From #tempCSV;
tu positionne les convert que je t'ai donnée précédement dans le select du dernier insert et tu a une table au petit oignons pour tes utilisateurs.
Tu n'aura fait QUE du sql (pas besoin de SSIS ni de visual studio, juste management studio), ton traitement sera totalement ensembliste (et non iteratif) et tout ca le plus simplement du monde.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 22 juil. 2009 à 10:26
J'ai oublier de préciser que pour faciliter les requete utilisateurs il est préférable de stoker les date au format DATETIME (donc pas de format ^^) et de leur présenter les données via une vue sur la table ou la colonne date sera transformer via un convert(varchar, macolonneDate, 103) qui leurs présentera les données au format JJ/MM/AAAA.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 22 juil. 2009 à 12:06
Pas des bases mais des tables, et il t'en faut autant que tu a de TYPE de fichier CSV, sinon tu peux importer tous les fichers CSV de meme structure dans une seule table temporaire.
Tu peux bien evidement porter tout ca dans SSIS via Visual Studio et la box "Lancer un lot T-SQL".
livinho38
Messages postés29Date d'inscriptionlundi 21 avril 2008StatutMembreDernière intervention24 juillet 20091 22 juil. 2009 à 12:17
oué oué je me suis tromper de terme mais je penser evidement a des table et non des bases.
je vais donc tenter en début d'aprem de suivre les étapes de nivsql avec le create table et les 2 requêtes
je parle donc du logiciel visual studio installé avec SQL Server 2008(entreprise).
je crée un nouveau projet, j'ajoute une tache de flux de données ou dedans je met import a partir dun fichier plat, conversion de données pui ajout dans une table OLE DB
ensuite je pense que dans l'onglet 'flux de contrôle' il faut une "tache d'execution de requete SQL" en sorti de la tache précédente.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 22 juil. 2009 à 15:54
Cela dis, et j'espere que tu m'excusera de la métaphore, je ne comprend pas trop l'interet d'utiliser une usine de toréfaction pour simplement se fair couler un expresso ...
SSIS est une structure lourde avec des déploiment de packages, un devellopement fastidieux et une consmation mémoire en plus de celle du serveur SQL. Il est bien adapté lors manipulations complexes tel les chargements de cube SSAS mais pour faire ce simple travail une UDF (fonction utilisateur) intégré a la base est largement suffisante. C'est d'autant plus étonnant que tu ne semble pas maitriser l'outil.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 22 juil. 2009 à 16:26
D'ou mon conseil de commencer par les fondamentaux. Se lancer bille en tete dans SSIS me semble un peu hatif.
Tu vas d'abord devoir decouper les "Briques" de ton projet.
Brique 1 : Reccuperation des données => Source n fichiers CSV Cible 1 base SQL Server.
Brique 2 : Constitution de ton Datamart => Source 1 Base SQL Server Cible 1 base SQL Server
Brique 3 : Restitution des données au utilisateurs de maniere simple pour eux.
Il convient de bien dissocier ces briques et d'employer pour chacune d'elles l'outil le plus adapté.
Pour la brique 1 je t'ai donner une solution simple qui se passe de SSIS et de sa surconsomation en ressource (donc un temps de traitement plus rapide). C'est un simple mecanisme d'import qui ne necessite en aucun cas la lourdeur d'un ETL. Il te suffit d'implémenter ca dans une fonction SQL et a la rigueure pour l'automatiser d'utiliser l'utilitaire SQLCMD en ligne de commande dans un script BAT lancer via une tache planifié Windows. Ceci avec l'argument de la simplicité et de l'absence total de surconsomation de ressources du serveur.
Pour les briques 2 et 3 Visual studio et SSIS (ainsi que SSAS et SSRS) te seront beaucoup plus utile, mais c'est déjà un autre sujet.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 22 juil. 2009 à 17:59
Je modulerais ce que tu viens de dire nhervagault par une chose :
Les ETL comme les Bases de données travaillent en mémoire, probleme ils ne travaillent pas dans la meme, ainsi pour traiter des données via un ETL il faut systématiquement avoir le double de mémoire RAM pour s'evité tout probleme de SWAP (ce qui est l'ennemi public numéro de tout serveur portant un SGBD), je ne suis donc pas convaincu du bien fondé d'un ETL sauf dans certains cas tres précis.
Oui je sais je suis totalement partial ayant en tant que DBA connus quelques grandes désillusion avec differents produits ETL, notement justement pour des problemes de mémoire RAM.
De maniere assez général je dirais qu'un ETL n'est reelement utile que quand les sources et les cibles sont multiples et de nature différentes (SQL database => SSAS, ORACLE <=> SQL etc). Dans les cas d'import de donnée de puis des fichier formaté l'utilisation des utilitaires prévu a cet effet par l'editeur du SGBD est le plus performant et le plus simple (SQLLoader pour Oracle, BULK INSERT pour SQL Server) et pour les extraction de données vers des SGBD de meme nature (Oracle <=> Oracle, SQL Database <=> SQL Database) toujours préférer le langage natif (PL/SQL pour oracle, T-SQL Pour SQL Serveur).
A titre informatif je tiens a préciser que je manipule dans le cadre de ma profession 2 ETL differents (SSIS et Business Objects DataIntegrator) et que je commence a connaitre un peu le sujet et surtout que mes collegues et moi avons subit de plein fouet les affres du TOUT ETL et que nous en sommes revenus.
livinho38
Messages postés29Date d'inscriptionlundi 21 avril 2008StatutMembreDernière intervention24 juillet 20091 23 juil. 2009 à 09:35
Merci de prendre du temps pour toute ces explication,
ça commence a devenir plus clair pour moi.
Après se n'est pas moi qui ai voulu a tout pris faire de l'ETL, simplement, mon collegue avant de partir 3 semaines m'a donner les objectifs, qui sont de réaliser ces package pour creer l'entrepot de données donc en utilisant l'ETL. C'est lui qui s'occupera par la suite de l'application (je termine le 31juillet et il faudrait vrmt que d'ici la il y ai tout pour l'entrepot de données au moins!)
c'est pour cela que pour ce que j'ai a faire je suis plutot accès sur l'ETL.
mme si apres vos explication je comprend votre réticence. (et je transmetrait dailleur dès lundi(retour de mon collegu) vos informations afin de voir avec lui ce qu'il en ai, mais il y a des chance que ça reste accès sur ETL.
Après j'ai + l'impresion que c'est pour les ressources systeme que ça cause pb donc si pour nous ce n'est pas un problème est-ce reelement un inconveniant d(utiliser ETL? puisque si je reprend les etapes données: charger les données , les formater, les metre ds les bases, je peux utiliser vos requete dans ETL non ?