[Oracle8i] LEFT OUTER JOIN foireux?

LEFT OUTER JOIN foireux? [Oracle8i] - SQL/NoSQL - Programmation

Marsh Posté le 18-07-2005 à 12:39:31    

Voir page 2
 
----------------------------
 
 
 
 
voila j'ai plusieurs fichiers textes que je dois transformer en tableau pour pouvoir les manipuler avec un code en C avant d'en refaire un fichier texte que je reprend sous excell (c'est just epour une question de rapidité d'execution, le tableau faisant dans les 200*60000 enfin si vous avez une idée pour que ça soit rapide directement en vba c'est pas mal non plus).
 
donc le txt contient une serie de nombre et de lettre, que je passe sous la forme de caractere dans un tableau.
 
je dois declarer un truc du genre  
 
char c[j][i][k];
 
premier probleme, pour faire l'allocation dynamique de ce truc [:totoz]. la methode avec les multi pointeur est obligatoire ou il y a un truc plus simple?
 
deuxio, pour passer du txt au tableau j'utilise cet algo, ça vous semble a peu près propre ou tout a fait merdique?
 

Code :
  1. while(!feof(data))
  2.     {
  3.         i=0;
  4.                      
  5.         do
  6.         {
  7.             k=0;
  8.            
  9.             do
  10.             {
  11.                 c=fgetc(data);
  12.                
  13.                 if (!feof(data))
  14.                
  15.                      {
  16.                      strcpy(i[j][i][k],c);
  17.                      k++;
  18.                      }
  19.                    
  20.             } while ((c != '\t') && (c != '\n') && !feof(data));
  21.            
  22.             i++;
  23.            
  24.         } while ((c != '\n') && !feof(data));
  25.        
  26.         j++;
  27.     }


 
heu c'est a peu près tout pour l'instant, merci.


Message édité par eraser17 le 11-08-2005 à 15:55:20
Reply

Marsh Posté le 18-07-2005 à 12:39:31   

Reply

Marsh Posté le 18-07-2005 à 14:08:57    

code pourri.
 
Mauvaise utilisation de feof.
Ne compile même pas (mauvais argument à strcpy).
Ne parlons pas de i[j][i][k]...
 
Ton corps de programme ça doit être
 

Code :
  1. int c;
  2. while((c = fgetc(fichier)) != EOF))
  3. {
  4.   // ici l'arithmétique pour trouver les valeurs de i, j et k
  5.  
  6.   donnees[i][j][k] = c;
  7. }

Reply

Marsh Posté le 18-07-2005 à 14:28:37    

merci, c bien ce que je pensais [:joce]

Reply

Marsh Posté le 18-07-2005 à 15:53:09    

quand je tente d'initialiser et que je fous ça
 
char ** a = (char*)malloc(R * C * sizeof *a );
 
il me repond ça
 
cannot convert `char*' to `char**' in initialization  
 
pourtant avec des int* ça fonctionnait [:gratgrat]

Reply

Marsh Posté le 18-07-2005 à 15:56:34    

ah ok c bon, ça se lance mais ça plante :o
 
mais ça se lance :o

Reply

Marsh Posté le 18-07-2005 à 15:57:32    

eraser17 a écrit :


char ** a = (char*)malloc(R * C * sizeof *a );
 


 
 
1. Le cast est inutile ;
 
2. Tu forces le retour de malloc() à "char *", pour le stocker dans "a" qui est un... "char **". Normal que le compilateur râle.

Reply

Marsh Posté le 18-07-2005 à 15:59:26    

j'ai modifié en  
 

Code :
  1. char ** a = (char**)malloc(R * C * sizeof *a );
  2.    
  3.         for(i = 0; i < C * R; i++)
  4.         {
  5.               a[i] = malloc(K * sizeof *(a[i]));
  6.         };


 
mais y a tjr un truc qui cloche :/

Reply

Marsh Posté le 18-07-2005 à 16:01:30    

Elmoricq a écrit :

1. Le cast est inutile ;
 
2. Tu forces le retour de malloc() à "char *", pour le stocker dans "a" qui est un... "char **". Normal que le compilateur râle.


 
 
comme ça alors?
 

Code :
  1. char ** a = malloc(R * C * sizeof *a );
  2.    
  3.         for(i = 0; i < C * R; i++)
  4.         {
  5.               a[i] = malloc(K * sizeof *(a[i]));
  6.         };

Reply

Marsh Posté le 18-07-2005 à 16:10:20    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define R 2000       //number of row
  4. #define C 100        //number of column
  5. #define K 20         //number of character
  6. int main(int argc, char *argv[])
  7. {
  8.    
  9.     int i,j,k;
  10.     char c;
  11.    
  12.     i=0;
  13.     j=0;
  14.     k=0;
  15.    
  16.     FILE *data;
  17.     FILE *txt;
  18.    
  19.     txt=fopen("txt.txt","w" );
  20.     data=fopen("Engine_History_Tst_Prod.txt","r" );
  21.    
  22.     //allocation of the memory
  23.    
  24.     char ** a = malloc(R * C * sizeof *a );
  25.    
  26.         for(i = 0; i < C * R; i++)
  27.         {
  28.               a[i] = malloc(K * sizeof *(a[i]));
  29.         };
  30.        
  31.     i=0;
  32.        
  33.    
  34.     fflush(stdout);
  35.     while((c = fgetc(data)) != EOF)
  36.         {
  37.               if (c == '\t')
  38.               {
  39.                j++;
  40.                k=0;
  41.               };
  42.              
  43.               if (c == '\n')       
  44.               {
  45.                i++;
  46.                j=0;
  47.                k=0;
  48.               };
  49.            
  50.              a[i * R + j][k] = c ;
  51.            
  52.              k++;
  53.            
  54.         };
  55.   fclose(data);
  56.   fclose(txt);     
  57.  
  58.   system("PAUSE" );
  59.   return 0;
  60. }

     
 
 
j'ai une erreur de type "memoire ne peut etre read". et a mon avis ça se passe au niveau du fgetc mais j'arrive pas a fixer le prob. si qqn voit l'erreur a la con que j'ai du faire.


Message édité par eraser17 le 18-07-2005 à 16:20:06
Reply

Marsh Posté le 18-07-2005 à 16:27:42    

tu fais même pas la base que je t'ai montré. te plains pas.

Reply

Marsh Posté le 18-07-2005 à 16:27:42   

Reply

Marsh Posté le 18-07-2005 à 16:29:32    

Taz a écrit :

tu fais même pas la base que je t'ai montré. te plains pas.


 
ben si :??:
 
enfin j'ai pas très bien compris ce que tu voulais dire par calcul arithmetique, je suis quand meme obligé de faire comme ça vu que je connais pas exactement le nombre de colonne et le nombre de caractere des données dans chaque case.
 
ou alors y a un truc que j'ai pas saisi?

Reply

Marsh Posté le 18-07-2005 à 16:34:33    

J'ai le sentiment que tu te compliques la vie pour pas grand chose.
 
Ton programme est peu lisible, ce qui va te jouer des tours à terme.
 
Tu devrais simplifier le problème et le mettre à plat avant de te lancer dans le code.
 
Autre chose : toujours tester le code retour des fonctions appelées. Par exemple, que se passe-t'il si fopen() échoue ? Ou si malloc() ne réussit pas à allouer la mémoire voulue ?
Ah, et à chaque malloc() doit correspondre un free().


Message édité par Elmoricq le 18-07-2005 à 16:37:03
Reply

Marsh Posté le 18-07-2005 à 16:36:59    

ouai je pense aussi mais je vois pas comment faire d'autre, les données sont vraiment aleatoire, en plus parfois la colonne est vide donc faut un truc qui s'adapte.
 
mais effectivement doit y avoir un moyen plus simple vu que j'avais fait un truc similaire y a 2 ans et que ça m'avait semblé moins compliqué. mais je me souvient plus comment j'avais fait :o

Reply

Marsh Posté le 18-07-2005 à 16:47:29    

effectivement y avait une erreur de chargement d'un fichier txt [:joce]

Reply

Marsh Posté le 18-07-2005 à 17:25:03    

ben non, t'as du pâté dans les yeux.

Reply

Marsh Posté le 18-07-2005 à 19:04:04    

ça doit etre ça :o
 
enfin je continuerais demain, quand je me suis cassé ça marchait a peu près mais visiblement il prenait mal les chaine de caract :o


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 19:10:01    

Si tu veux allouer dynamiquement un tableau à 3 dimensions, il te faut allouer la première, puis pour chaque occurrence de la première allouer la seconde puis pour chaque occurrence de la seconde il te faut allouer la 3°
Un peu comme ça

Code :
  1. char ***tab;
  2. tab=(char ***)malloc(nb_lig * sizeof(char**));
  3. for (i=0; i < nb_lig; i++)
  4. {
  5.     tab[i]=(char**)malloc(nb_col * sizeof(char*));
  6.     for (j=0; j < nb_col; j++)
  7.     {
  8.         tab[i][j]=(char*)malloc(nb_car * sizeof(char));
  9.     }
  10. }


 
En plus, comme l'a dit Elmorick, faut que tu testes chaque malloc et que tu décides quoi faire si ça plante
Enfin, en fin d'utilisation, il te faut désallouer le tableau de la même façon (tu peux déléguer ça à une fonction particulière que tu appelleras aussi si le malloc plante), du style
 

Code :
  1. void free_tab(char ***tab, size_t nb_lig, size_t nb_col)
  2. {
  3.     size_t i, j;
  4.     if (tab)
  5.     {
  6.         for (i=0; i < nb_lig; i++)
  7.         {
  8.             if (tab[i])
  9.             {
  10.                 for (j=0; j < nb_col; j++)
  11.                 {
  12.                     if (tab[i][j])
  13.                        free(tab[i][j])
  14.                 }
  15.                 free(tab[i]);
  16.             }
  17.         }
  18.         free(tab);
  19.     }
  20. }


 
Comme tu peux le voir, cela devient vite bien chiant. Surtout que ça sert à rien de faire de l'allocation dynamique quand les tailles sont figées => char tab[x][y][z]
       


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 18-07-2005 à 19:15:49    

ben ouai mais vu que les taille ici sont tab[60000][200][20] ça plante quand je fais pas d'allocation dynamique :/
 
et le truc que j'ai fait sa émule en quelque sorte une 3 dim en un tableau 2 dim mais c vrai que c du chipotage.
 
merci pour les bouts de codes :jap:


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 19:30:37    

bon écoute tu fais ça :
 

Code :
  1. struct BigArray
  2. {
  3.   int array[60000][200][20];
  4. };
  5. ...
  6. struct BigArray *ba = malloc(sizeof *ba);
  7. ba->array[x][y][z] = 42;
  8. free(ba);


 
 

Reply

Marsh Posté le 18-07-2005 à 19:32:30    

Reply

Marsh Posté le 18-07-2005 à 19:37:05    

En fait j'espère que int array[60000][200][20] c'est une blague, parce que tu n'as pas l'air de réaliser combien ça fait en gigaoctet

Reply

Marsh Posté le 18-07-2005 à 22:14:49    

Taz a écrit :

En fait j'espère que int array[60000][200][20] c'est une blague, parce que tu n'as pas l'air de réaliser combien ça fait en gigaoctet


 
 
ouai c vrai qu'une fois le calcul fait [:figti]
 
et ce sont pas des int, ce sont des char :o
 
mais c justemment pour ça que je le fais en C, sous excel le traitement de fichiers de cette taille prend des heures et ils faudrait diminuer ça.
 
mais je vais essayer de voir s'il n'y a pas moyen de diviser ça en fichier de 10000 lignes.


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 22:27:58    

C'est quoi la structure de ton fichier ?
 
Parce qu'à mon avis, doit y avoir moyen de faire ça autrement. Avant de coder, faut concevoir. ;)

Reply

Marsh Posté le 18-07-2005 à 22:39:26    

en gros c'est :
 
numerodeserie   date  test   idle  xxxx  xxxxx
jsld5546465     18/04/07 7:13 rated 4564 848645
jkjsjiojkll     19/01/04 8:17 passed 4568 1231535
 
sur une centaine de colonne et un nombre de ligne pouvant aller jusqu'a la fin d'une feuille excell. entre chaque colone y a un '\t' et a la fin de chaque ligne un '\n'
 
y a 4 fichier txt different et il faut faire diverse operations pour reunir les info de ces 4 fichier en un seul que je reprend ensuite dans excel.
 
donc j'ai pensé prendre les 4 fichiers textes, les convertir en tableau et ensuite bosser sur les tableau pour composer le tableau final que je retransforme en texte. ce qui sera surement plus rapide que les meme operations realisée directement sous excell en vba.


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 22:41:09    

mais ils font combien de Mo tes fichiers excel ?

Reply

Marsh Posté le 18-07-2005 à 22:45:09    

ben celui sur lequel je travail comme exemple en fait seulement 80 mais sinon les complet je sais pas, j'en ai pas encore vu [:joce]


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 22:48:07    

mais d'après ce qu'on m'a dit, rien que pour ouvrir un des fichier il faut minimum 30 minutes.


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 22:50:33    

ben z'êtes con de faire ça dans des fiches excel. Il faut une base de données, une vrai (pas Access). La quantité d'informations est telle, qu'il te faut un vrai système pour gérer ça, et ensuite utiliser des algorithmes qui permettent de travailler sans avoir toutes les données en mémoire. Un SGBD avec un langage comme SQL permet de faire ça tranquillement

Reply

Marsh Posté le 18-07-2005 à 22:51:22    

c'est un stage dans quelle PME mitée ton truc ? t'es en quoi ? Première année de fac ?


Message édité par Taz le 18-07-2005 à 22:51:47
Reply

Marsh Posté le 18-07-2005 à 22:53:18    

et hooooo, moi je suis la que depuis 2 semaines, je suis en stage, en plus je suis pas programmeur ni informaticien, je suis mécanicien. on m'a bombardé analyste-programmeur après que j'ai fais 2-3 macro excell et maintenant j'essaye d'arranger tous leur outils d'analyse de donnée pour en faire des trucs potables :o
 
en plus a la base ils prennent leur donnée dans une base oracle avant de refoutre ça sur excell. je veux bien essayer de court circuiter excel mais je sais pas comment ça marche oracle.


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 22:57:14    

Taz a écrit :

c'est un stage dans quelle PME mitée ton truc ? t'es en quoi ? Première année de fac ?


 
c'est un stage dans la boite qui detient 75% du marché des moteur diesel en europe [:joce]
 
ouai moi aussi ça m'a surpris de voir l'état de leur prog info. avant que j'arrive ça faisait 3 ans qu'ils faisait 4h de manipulation dans des fichiers excel pour obtenir des graph alors qu'avec une conne macro ça prend maintenant 30 sec [:dawa]


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 22:57:54    

eraser17 a écrit :

et hooooo, moi je suis la que depuis 2 semaines, je suis en stage, en plus je suis pas programmeur ni informaticien, je suis mécanicien.


 
Aïe.
Imagine un informaticien à qui on demande de se lancer dans la mécanique, alors qu'il n'en a jamais fait avant.
Voilà ta situation, mais c'est également la notre : ça ne va pas être facile de t'expliquer comment faire.
 
 

eraser17 a écrit :

en plus a la base ils prennent leur donnée dans une base oracle avant de refoutre ça sur excell. je veux bien essayer de court circuiter excel mais je sais pas comment ça marche oracle.


 
J'imagine qu'il doit y avoir une bibliothèque pour faire ça en C.
Autrement, si le langage ne t'est pas imposé, alors il doit y avoir moyen de faire ça plus simplement dans d'autres langages.
 
 
EDIT : orthographe  :o


Message édité par Elmoricq le 18-07-2005 à 23:01:08
Reply

Marsh Posté le 18-07-2005 à 22:59:25    

ben t'arriveras jamais à rien ... ça te viendrait pas à l'idée de demander à un informaticien de faire de la mécanique.
 
Déjà que tu rames pas possible pour un pauvre morceau de C (d'ailleurs, pourquoi t'as choisi le C), tu n'as aucune notion sur la gestion de la mémoire ce qui est essentiel quand on manipule des gros jeux de données. Excel est pas adapté du tout, tu le constates. Bascule vers un langage de script et travail directement avec leur BDD. Ou mieux, trouve quelqu'un de qualifié pour faire ça.

Reply

Marsh Posté le 18-07-2005 à 23:03:18    

Reply

Marsh Posté le 18-07-2005 à 23:04:53    

Taz a écrit :

ben t'arriveras jamais à rien ... ça te viendrait pas à l'idée de demander à un informaticien de faire de la mécanique.
 
Déjà que tu rames pas possible pour un pauvre morceau de C (d'ailleurs, pourquoi t'as choisi le C), tu n'as aucune notion sur la gestion de la mémoire ce qui est essentiel quand on manipule des gros jeux de données. Excel est pas adapté du tout, tu le constates. Bascule vers un langage de script et travail directement avec leur BDD. Ou mieux, trouve quelqu'un de qualifié pour faire ça.


 
 
ben j'ai choisi le C parceque c'est le seul language évolué que je connaissait a peu près. mais je l'utilise pour des simulations de systeme mécanqiue moi, par pour gerer et travailler sur watmille données.
 
je vais essayé de voir ce qu'y a moyen de faire directement sur oracle. ça doit pas etre si compliqué que ça :o


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 23:07:02    

y a quoi comme language pour faire ça? sacahnt qu'en genral j'apprend assez vite mais qu'il faut pas me taper de l'assembleur non plus :o


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 23:10:50    

moi je dirais un truc de script genre python

Reply

Marsh Posté le 18-07-2005 à 23:11:24    

eraser17 a écrit :

sacahnt qu'en genral j'apprend assez vite


vite et mal, on bien vu  :whistle:

Reply

Marsh Posté le 18-07-2005 à 23:11:45    

Elmoricq a écrit :

Aïe.
Imagine un informaticien à qui on demande de se lancer dans la mécanique, alors qu'il n'en a jamais fait avant.
Voilà ta situation, mais c'est également la notre : ça ne va pas être facile de t'expliquer comment faire.


 
d'un autre coté je suis pas non plus totalement noob en info, ça fait quand meme une bonne dizaine d'année que j'en fait, c'est juste que j'ai jamais travaillé sur des masses de données pareille et je sais pas trop bien comment m'y prendre.


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le 18-07-2005 à 23:12:11    

Taz a écrit :

vite et mal, on bien vu  :whistle:


 
minute, ça fait que 2 jours que je fais du C [:joce]


---------------
Mon appli de réalité augmentée sur Android -- et sur iPhone/iPad-- Mes VTT en 650B - 584mm..
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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