SQL server 2008, import données CSV

Signaler
Messages postés
29
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
24 juillet 2009
-
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
-
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

22 réponses

Messages postés
29
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
24 juillet 2009
1
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.

voila tt
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Salut,

Regardes du coté de SSIS pour faire les modification.

SSIS est l'ETL de sqlserveur fournit à partir de la version standard.

Il faut les outils clients sur ton poste.

Bon dev.
Messages postés
29
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
24 juillet 2009
1
oué c ce que je fait
je travail sur SQL Server 2008 version entreprise.

j'essai avec visual studio des procedure mais pour le moment je ne trouv pas comment faire ça
si tu as une idee.;

merci en tt k
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
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.
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
Messages postés
29
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
24 juillet 2009
1
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.!
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
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.
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
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.
Messages postés
29
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
24 juillet 2009
1
d'accord je vais essayer de partir dans se sens, mais cela implique d'avoir autant de base temporaire que de fichier CSV ??

ensuite est-ce possible de realiser tout ça sans passer par des requete isolé mais par visual studio?
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
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".
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Salut,

C'est pas des bases temporaire mais des tables temporaires qui sont proposées et elles sont créé et détruite dynamiquement
il me semble.

Qu'entens-tu par visual studio.
Messages postés
29
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
24 juillet 2009
1
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.
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Oui c'est SSIS la partie visual studio avec les datacontrol et dataflow.
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
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.
Messages postés
29
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
24 juillet 2009
1
oups il manque quelques mots la ... tout sa donc pour expliquer l'utilisation de visual studio.
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
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.
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Oui, Les outils d'ETL permet de faire des choses bien puissante.

Mais comme on ne connais pas et on a pas envie de connaître toutes les données du problème, on essaie de guider.

Si les données sont une centaine de ligne, un programme à la main peut faire l'affaire
et que tu maîtrise tes bases.

Ce que dit nivsql, c'est que la premeiere choses est de charger les données brute dans une base
(avec des champs que texte par exemple)

Ensuite a amener les conversions sur les données. (etape de extract)

Apres lire cette base et mettre dans la vrai table (etape de transform)
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
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.
Messages postés
29
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
24 juillet 2009
1
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 ?
Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
2
y'a aussi une question de performance mais bon, si tu as des impératifs ...

Preuve encore si besoin est que les décideurs qui ignorent tout de la techniques prennent des décisions à l'encontre du bon sens.