sql loader

sql loader - SQL/NoSQL - Programmation

Marsh Posté le 16-05-2007 à 16:34:12    

Bonjour,
svp j'ai un problème; j'ai un fichier qui comprend près de 2000 lignes et je veux remplir une table oracle à partir du fichier.  
pour cela j'utilise l'outil sql loader; mais le problème que je rencontre est que les différents champs du fichier ne sont pas délimités. comment convertir le fichier en un fichier avec délimiteur avant de faire le load?
voici une partie du fichier:

Citation :

<gsm utc="20070508200447" type="2" imsi="615010100522901" aTon="0" bIsdn="3386508" bTon="2" svc="11" bear="00" time="000047" msc="040011" loc="00011" cell="00062" imei="35800800690947" origin="0" chan="0"></gsm>
 <gsm utc="20070508200327" type="2" imsi="615010100524907" aTon="0" bIsdn="002218362898" bTon="1" svc="11" bear="00" time="000131" msc="040011" loc="00011" cell="00565" imei="35400900809249" origin="1" chan="0"></gsm>
 <gsm utc="20070508195113" type="2" imsi="615010100337448" aTon="0" bIsdn="001018" bTon="1" svc="11" bear="00" time="000850" msc="040011" loc="00011" cell="00030" imei="35394101031678" origin="1" chan="0"></gsm>
 <gsm utc="20070508200100" type="2" term="2" imsi="615010100484602" aTon="0" bIsdn="9199090" bTon="2" svc="11" bear="00" time="000266" msc="040011" loc="00011" cell="00016" imei="35800200218667" origin="0" chan="0"></gsm>
 <gsm utc="20070508200508" type="2" imsi="615010100707568" aTon="0" bIsdn="2263519" bTon="2" svc="11" bear="00" time="000018" msc="040011" loc="00011" cell="00730" imei="35984100041571" origin="0" chan="0"></gsm>
 <gsm utc="20070508200456" type="2" imsi="615010100975274" aTon="0" bIsdn="9834084" bTon="2" svc="11" bear="00" time="000034" msc="040011" loc="00011" cell="00087" imei="52008261402755" origin="0" chan="0"></gsm>
 <gsm utc="20070508200418" type="2" imsi="615010101037432" aTon="0" bIsdn="9402220" bTon="2" svc="11" bear="00" time="000075" msc="040011" loc="00011" cell="00012" imei="35762000102462" origin="0" chan="0"></gsm>
 <gsm utc="20070508200259" type="2" imsi="615010100585766" aTon="0" bIsdn="9462955" bTon="2" svc="11" bear="00" time="000156" msc="040011" loc="00011" cell="00028" imei="35453201112751" origin="0" chan="0"></gsm>
 <gsm utc="20070508200529" type="2" imsi="615010100829351" aTon="0" bIsdn="4471076" bTon="2" svc="11" bear="00" time="000009" msc="040011" loc="00011" cell="00076" imei="35077020641076" origin="0" chan="0"></gsm>
 <gsm utc="20070508200459" type="2" imsi="615010100355897" aTon="0" bIsdn="2356901" bTon="2" svc="11" bear="00" time="000039" msc="040011" loc="00011" cell="00209" imei="35222300516332" origin="0" chan="0"></gsm>
 <gsm utc="20070508200407" type="2" term="2" imsi="615010100303025" aTon="0" bIsdn="9082674" bTon="2" svc="11" bear="00" time="000092" msc="040011" loc="00011" cell="00086" imei="35835800229666" origin="0" chan="0"></gsm>
 <gsm utc="20070508200527" type="2" term="2" imsi="615010100357821" aTon="0" bIsdn="9040000" bTon="2" svc="11" bear="00" time="000012" msc="040011" loc="00011" cell="00016" imei="35557000391829" origin="1" chan="0"></gsm>
 <gsm utc="20070508200511" type="2" imsi="615010101017568" aTon="0" bIsdn="2719459" bTon="2" svc="11" bear="00" time="000016" msc="040011" loc="00011" cell="00086" imei="35861200132624" origin="0" chan="0"></gsm>
 <sms utc="20070508200529" type="1" imsi="615010100285302" aTon="0" bIsdn="040008" bType="1" pid="0" bTon="2" svc="21" bear="00" time="000001" msc="040011" loc="00011" cell="00014" imei="35725800998454"></sms>
 <sms utc="20070508200530" type="1" imsi="615010100269192" aTon="0" bIsdn="040008" bType="1" pid="0" bTon="2" svc="21" bear="00" time="000001" msc="040011" loc="00011" cell="00162" imei="35251300337409"></sms>
 <sms utc="20070508200530" type="1" imsi="615010100496392" aTon="0" bIsdn="040008" bType="1" pid="0" bTon="2" svc="21" bear="00" time="000001" msc="040011" loc="00011" cell="00565" imei="35862200653685"></sms>
 <sms utc="20070508200531" type="1" imsi="615010100719946" aTon="0" bIsdn="040008" bType="1" pid="0" bTon="2" svc="21" bear="00" time="000001" msc="040011" loc="00011" cell="00721" imei="35883600596190"></sms>
 <sms utc="20070508200531" type="1" imsi="615010100829364" aTon="0" bIsdn="040008" bType="1" pid="0" bTon="2" svc="21" bear="00" time="000001" msc="040011" loc="00011" cell="00570" imei="35839700816617"></sms>
 <sms utc="20070508200531" type="1" imsi="615010100411844" aTon="0" bIsdn="040008" bType="1" pid="0" bTon="2" svc="21" bear="00" time="000001" msc="040011" loc="00011" cell="00786" imei="35301600076961"></sms>
 <sms utc="20070508200532" type="1" imsi="615010100517325" aTon="0" bIsdn="040008" bType="1" pid="0" bTon="2" svc="21" bear="00" time="000001" msc="040011" loc="00011" cell="00015" imei="35598700026833"></sms>
 


 je voudrais que "utc", "type", "imsi", ... soient les noms des champs et leur valeur respective soit la ligne.
merci de votre réponse.

Reply

Marsh Posté le 16-05-2007 à 16:34:12   

Reply

Marsh Posté le 16-05-2007 à 22:59:36    

C'est du XML ton fichier, donc une xsl(t) et tu devrais pouvoir le convertir facilement...

Reply

Marsh Posté le 18-05-2007 à 09:26:49    

jbourdellon a écrit :

C'est du XML ton fichier, donc une xsl(t) et tu devrais pouvoir le convertir facilement...


 
bonjour  
merci d'avoir répondu; tu dis

Citation :

donc une xsl(t) et tu devrais pouvoir le convertir facilement...


mais j'ai pas très bien compris ce ke tu disais par là; et je peux convertir avec sql loader toujours? ou bien un autre outil ? si oui lequel?
svp, aidez-moi.  
merci

Reply

Marsh Posté le 18-05-2007 à 10:54:24    

Une méthode à l'ancienne qui marche est de faire une petite moulinette, par exemple en VBS pour contvertir le fichier :

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fso, f_in, f_out
Set fso = CreateObject("Scripting.FileSystemObject" )
Set f_in = fso.OpenTextFile("fichier_in.txt", ForReading,True)
Set f_out = fso.OpenTextFile("fichier_out.txt", ForWriting,True)
 
Do While f_in.AtEndOfLine <> True
   l_in = f_in.ReadLine
 
   v_utc = "null"
   j = instr(l_in, "utc=" )
   If (j <> 0) Then
      k = instr(j + 5, l_in, chr(34))
      If (k > j) Then
         v_utc = mid(l_in, j + 5, k - j - 5)
      End If
   End If
 
   v_type = "null"
   j = instr(l_in, " type=" )
   If (j <> 0) Then
      k = instr(j + 7, l_in, chr(34))
      If (k > j) Then
         v_type = mid(l_in, j + 7, k - j - 7)
      End If
   End If
 
   f_out.WriteLine "INSERT INTO table_toto(utc, type)" _
                   & " VALUES('" & v_utc & "', '" & v_type & "'" _
                   & " );"
Loop
 
f_out.Close
f_in.Close


Mettre ces lignes dans un fichier nommé, par exemple, cvt_fic1.vbs et cliquer sur ce fichier.
Avec les données en exemple, cela donne :

INSERT INTO table_toto(utc, type) VALUES('20070508200447', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200327', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508195113', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200100', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200508', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200456', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200418', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200259', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200529', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200459', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200407', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200527', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200511', '2');
INSERT INTO table_toto(utc, type) VALUES('20070508200529', '1');
INSERT INTO table_toto(utc, type) VALUES('20070508200530', '1');
INSERT INTO table_toto(utc, type) VALUES('20070508200530', '1');
INSERT INTO table_toto(utc, type) VALUES('20070508200531', '1');
INSERT INTO table_toto(utc, type) VALUES('20070508200531', '1');
INSERT INTO table_toto(utc, type) VALUES('20070508200531', '1');
INSERT INTO table_toto(utc, type) VALUES('20070508200532', '1');

Puis, il n'y a plus qu'à lancer sqlplus avec ce fichier.

Reply

Marsh Posté le 18-05-2007 à 18:24:33    

hello, merci olivthill,
j'ai essayé ton script et je sens ke ça m'aiderait parce que j'ai fait un essai et pour utc et type, ça marche, parfaitement. maina pour les autres, ça ne marche pas parce que là où tu as fait
 

Citation :


If (j <> 0) Then  
      k = instr(j + 5, l_in, chr(34))  
      If (k > j) Then  
         v_utc = mid(l_in, j + 5, k - j - 5)  
      End If  
 


et

Citation :


   If (j <> 0) Then  
      k = instr(j + 7, l_in, chr(34))  
      If (k > j) Then  
         v_type = mid(l_in, j + 7, k - j - 7)  
      End If  


je me demandes comment tu fais pour ajouter "5" et ensuite "7" ; moi j'ai fait une incrémentation de 2 à chaque fois et ça ne marche pas;
. peut tu m'expliquer cette partie? c'est quoi les nombres là?
grand merci de ta part.


Message édité par floflo164 le 18-05-2007 à 18:26:16
Reply

Marsh Posté le 18-05-2007 à 22:36:03    

Les chiffres 5 et 7 que j'ai utilisés correspondent aux nombres de caractères entre le début de l'étiquette et le début de la valeur pour le champ. Par exemple la longueur de "utc=" est 4, mais il faut aussi aller au delà du premier guillemet, donc 4+1=5. Pour le deuxième champ, j'ai aussi inclus l'espace du début, mais ce n'était pas obligatoire.
 
Dans mon code, chr(34) désigne un guillemet.
mid(chaine, début, longueur) prend un morceau de la chaine à partir de la position de début indiquée, et sur une longueur qui lui est indiquée.
instr(...) signifie de faire une recherche "in string". Il y a deux syntaxes :
1. La syntaxe avec deux paramètes, par exemple, j = instr(l_in, "utc=" ) qui met dans j la position du début de "utc=" à l'intérieur de la chaine l_in. Si "utc=" n'est pas trouvé, j contiendra zéro.
2. La syntaxe avec trois paramètes, par exemple, k = instr(j + 5, l_in, chr(34)), qui commence la recherche à partir de la position qui est donnée dans le premier paramètre, ici j+5.
 
Le programme recherche une étiquette, par exemple "utc=". Il calcule le début de la valeur associée, en ajoutant la longueur de l'étiquette et du premier guillemet. Il recherche la position du guillemet fermant. Il prend la sous-chaine se trouvant entre le premier guillemet et le deuxièem guillemet.
 
Pour le champ imsi, on aurait :

 v_imsi = "null"  
   j = instr(l_in, " imsi=" )  
   If (j <> 0) Then  
      k = instr(j + 7, l_in, chr(34))  
      If (k > j) Then  
         v_imsi = mid(l_in, j + 7, k - j - 7)  
      End If  
   End If


On pourrait écrie le même genre de programme en C, en PHP, en shell Unix, etc.

Reply

Marsh Posté le 21-05-2007 à 10:51:54    

hello olivthill,
merci infiniment pour ton aide. grâce à toi j'ai pu résoudre mon pble.
merci

Reply

Marsh Posté le 21-05-2007 à 18:26:04    

hello, svp c'est encore moi; désolée de vous déranger.
mais je veux que mon script commence la lecture du fichier à partir de la seconde ligne, qu'elle ignore la seconde;  
au fait voici le début de mon fichier

Citation :


<cdrs version="1" producer="MAP" utc="20070509093016" utcOffset="+0000" cdrCount="00005662">
 <gsm utc="20070508200450" type="2" term="2" imsi="615010100456969" aTon="0" bIsdn="9310231" bTon="2" svc="11" bear="00" time="000035" msc="040011" loc="00011" cell="00341" imei="35826800500233" origin="0" chan="0"></gsm>
 <gsm utc="20070508200515" type="2" imsi="615010100212636" aTon="0" bIsdn="2213792" bTon="2" svc="11" bear="00" time="000008" msc="040011" loc="00011" cell="00210" imei="35154601987308" origin="0" chan="0"></gsm>
 <gsm utc="20070508200517" type="2" imsi="615010100439569" aTon="0" bIsdn="2209034" bTon="2" svc="11" bear="00" time="000007" msc="040011" loc="00011" cell="00567" imei="35227101175512" origin="0" chan="0"></gsm>
 <sms utc="20070508200535" type="1" imsi="615010100544312" aTon="0" bIsdn="040008" bType="1" pid="0" bTon="2" svc="21" bear="00" time="000001" msc="040011" loc="00011" cell="00029" imei="35839800448909"></sms>
 <gsm utc="20070508200452" type="2" term="2" imsi="615010100963374" aTon="0" bIsdn="9189756" bTon="2" svc="11" bear="00" time="000044" msc="040011" loc="00011" cell="00016" imei="35574500774865" origin="0" chan="0"></gsm>


je ne voudrais pas  travailler sur la ligne

Citation :

<cdrs version="1" producer="MAP" utc="20070509093016" utcOffset="+0000" cdrCount="00005662">


qu'est-ce que je mets pour dire à mon script de commencer à partir de la seconde ligne?
merci infiniment pour votre aide.
klk'un peut-il m'aider? merci

Reply

Marsh Posté le 21-05-2007 à 21:40:47    

Pour que le script commence à la deuxième ligne, il suffit d'insérer
   f_in.ReadLine  
juste avant la boucle Do While f_in.AtEndOfLine <> True  

Reply

Marsh Posté le 22-05-2007 à 09:28:06    

Hello, merci beaucoup olivthill.
cc gentil de ta part. mon problème est résolu.
merci et bonne journée

Reply

Marsh Posté le 22-05-2007 à 09:28:06   

Reply

Marsh Posté le 22-05-2007 à 19:55:30    

bonjour svp, quelqu'un pourrait m'aider à créer un fichier .bat?
c'est que avec le fichier sql que je génère, je voudrais k'il s'éxécute automatiquement, à la fin de la génération. j'ai cru comprendre qu'un fichier .bat pourrait m'aider (puisqu'il s'exécute automatiquement, je crois); mais je n'ai aucune connaissance de comment je pourrai le faire.
quelqu'un pourrait-il m'aider à le faire?
merci de votre part et bonne soirée
 
(P.S.  pour olivthill, ex

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed