Eclatement d'un Fichier en deux

Fermé
Montréalois - 5 mai 2008 à 20:04
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 - 9 mai 2008 à 20:54
Bonjour,
J'ai un fichier (près de 5 000 000 lignes, et de 41 Collonnes) la dernière collonne contient le type de chaque ligne (normale, ou anormale), je veut l'éclater en deux nouveaux fichiers (de telle sorte que le premier fichier doit contenir les lignes ayant la collonne Normale, et le deuxième ne contient que celles anormales).
Merci d'avance pour votre aide.
A+
A voir également:

10 réponses

Tiller Messages postés 781 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 14 septembre 2008 211
5 mai 2008 à 20:36
Quel langage?
0
Montréalois
5 mai 2008 à 20:38
Java.
0
Montréalois
5 mai 2008 à 21:12
En fait peu importe le langage de programmation, mais j'envisage Java ou C++.
merci.
A+
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
5 mai 2008 à 21:29
Je suppose que normale et anormale son exclusives.
0
Montréalois
5 mai 2008 à 21:44
En fait, la structure de chaque ligne de mon fichier est comme suit:

0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,normal.


0,icmp,ecr_i,SF,1032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,511,511,0.00,0.00,0.00,0.00,1.00,0.00,0.00,255,255,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,anormal.


0,tcp,http,SF,239,486,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,19,19,1.00,0.00,0.05,0.00,0.00,0.00,0.00,0.00,normal.

.................

.................etc.

A+
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
5 mai 2008 à 21:51
Tu va trouver que je suis têtu, Mais pourquoi ta dernière colonne ne serait-elle pas booléenne. Elle prendrait la valeur VRAI (TRUE) si elle était normale, FAUX (FALSE) dans le cas contraire.
Déjà sur 5 000 000 d'enregistrement tu gagnerais de la place disque.
0
Montréalois
5 mai 2008 à 21:55
Tout à fais, mais ça changera pas grand chose, à mon avis.
A+
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83 > Montréalois
5 mai 2008 à 22:30
Mon algo est "à l'ancienne", mais pour l'instant il fonctionne.
Je suppose que tu ne veux pas de sql?!

// On suppose maitenant que tu n'as plus qu'une colonne

NoOffset et un entier //No de la colonne Normal, Anormal
Affecter NoOffset à x // X étant la valeur de la colonne

Créer fichier NORMALE
Créer fichier ANORMALE

Ouvrir fichier INITIAL
Ouvrir fichier NORMALE
Ouvrir fichier ANORMALE

Faire tant que NON fin INITIAL
Lire Enregistrement INITIAL
SI LireOffsetEnregistrement = ... // True ou normal
Alors
EcrireEnregistrement dans NORMALE
SINON
EcrireEnregistrement dans ANORMALE
FINSI
PasserAEnregistrementSuivant
Fin Faire

FermerTout

C'est du séquentiel, soit, mais c'est la première idée qui me soit passée par la tête. cf Ma première ligne de signature

Désolé j'ai écrit cela "A la volée" je ne suis pas passé par un éditeur de texte, de ce fait, je n'ai pas pu indenter.
0
Montréalois > dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011
6 mai 2008 à 13:41
Tout a fait, mais c'est essentiel de travailler sur toutes les lignes (en fait chaque ligne dans le fichier texte prend 3 lignes, cela veut dire qu'en tout j'en ai près de 5000 000x3 ligne texte, les valeurs de chaque lignes sont en majorité numériques séparées par des virgules, mais il y a aussi d'autres qui non pas numriques comme TCP, UDP,HTTP, ainsi de suite, sinon toutes les lignes sont pareilles.

Voci un exemple d'une seule ligne de mon fichier:

0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,
0.00,0.00,1.00,0.00,0.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,
normal.

Note que (normal, anormal) n'est pas consédirée comme valeur parmi les 41 (attribut ou colonne) elle est comme identification ou type (etiquette) pour chaque ligne.

Merci encore une fois de m'avoir proposer cette idée, si t'as plus de détails selon la spécification ce sera mieux.
merci
A+
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83 > Montréalois
6 mai 2008 à 21:37
Salut Montréalois.
Ton traite ment doit fairs partie d'un tout, n'est il pas. Que doit faire ton programme STP
Quelles sont les condition pour devenir Normal ou Anormal ?
0
Montréalois > dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011
6 mai 2008 à 21:54
salut dandypunk.
En fait après la division de mon fichier, je travaillerais sur l'un des deux ficiers résultants (NORMAL, ANORMAL) et cela en appliquant un algorithme de partitionnement (classification non-suppervisée) capable à nous générer un ensemble de classes selon le degré de similarité des lignes (vecteurs ou enregistrements) de telle sorte que les vecteurs les plus semblables doivent appartienent au meme classe, mais avant tout ça on doit définir le degré de similarité, et d'autre choses, bref c un peu compliqué mais c à peu près l'essentiel du traitement.
A+
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
6 mai 2008 à 22:12
C'est un peut moins confus pour moi.
Y a-t-il des traitements sur ANORMAL ?
0
Montréalois
6 mai 2008 à 22:42
Oui biensure, en fait on appliquera un algorithme de partitionnement sur le fichier ANORMAL, cet algo sert à classifier les différents vecteurs du fichier ANORMAL en un ensemble de classes (relativement pas grand 4 ou 5) et cela en fonction de degré de simiilarité de ces enregistreements.
A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
6 mai 2008 à 23:08
Désolé je cale.
Dernière idée.
Il faut passer par C. Tu définit ton enregistrement en fonction des données à traiter, e.g. pour la deuxième partie : protocole est une chaine. etc... via une structure.

Il est aussi possible de créer un classe via c++

Exemple de structure :
Struct NormalAnormal
{
	int toto
	Char[5] Protocole //ceci est le protocole
	...
}


Pour avoir accès à un membre de la structure e.g. toto. Utilise NormalAnormal.toto

Il te faut donc charger tes trois lignes dans la structure.
Considérer la structure comme un enregistrement
Appliquer tes algos

Pour plus d'info ISBN : 2-225-82070-8

C'est la "bible" du C par Kernighan & Ritchie
0
Bonsoir,

S'il s'agit juste de scinder en deux un gros fichier en fonction du critère normal ou anormal, c'est assez simple à réaliser.
D'ailleurs l'algorithme à été donné plus haut par dandypunk.

Je peut te proposer un petit programme en C++ ou en VB ou même une macro VBA Excel qui réalise ça. J'ai juste besoin de savoir si les lignes de données sont réellement écrites sur trois lignes de texte ou sur une seule.

Si tu es intéressé, fait moi signe. A+.
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
6 mai 2008 à 23:37
Salut amigo,
à priori c'est sut trois. C'est pour cela que j'ai proposé unestruct C
0
Montréalois
7 mai 2008 à 20:37
bonsoir amigo,
peut tu me montrer comment fonctionne ton idée, en c++ ou autre.
merci d'avance.
A+
0
Salut,

Si c'est en trois lignes, on prend le meme algo, mais au lieu de lire une ligne à la fois on en lit 3, on regarde si le texte "normal" ou "anormal" est présent dans la troisième ligne et on écrit ces trois lignes dans l'un ou l'autre fichier.

Pas besoin de structures.

A+.
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
7 mai 2008 à 00:26
Exact amigo, cela lui évite de transférer son fichier dans une structure.

C'est ma méthode de réflexion "BDD" qui m'a induit en erreur.
0
Ah, OK

Je ne voyais pas pourquoi tu parlais de structures, et je me suis permis d'intervenir.
Là il se fait tard, on verra demain,

Salut.
0
Bonjour,

Voila le programme qui va eclater le fichier de données principal en deux fichiers suivant le critère normal/anormal.

Il a été conçu en supposant que chaque ligne de données est écrite sur 3 lignes physiques, comme ça:
0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,
0.00,0.00,1.00,0.00,0.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,
normal.
0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,
0.00,0.00,1.00,0.00,0.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,
anormal.

Si ce n'est pas le cas, c'est à dire que c'est plutôt comme ça:
0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0­.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,normal.
0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0­.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,anormal.

alors il faudra légèrement modifier le programme.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LONG_BUF  256        /* longueur du buffer des fichiers */
int instr ();
int main()
{
FILE *fpI, *fpA , *fpN;
char ligne1[LONG_BUF], ligne2[LONG_BUF],ligne3[LONG_BUF] ;
char fich_I [81],  fich_A [81],  fich_N [81];
int p;
char *fin_fich_I;
   /* Nom du Fichier d'entrée */

   printf ("\nNom du fichier d'entrée : ");
   gets (fich_I) ;
   if (strcmp (fich_I, "") == 0)      exit (0);
   fpI = fopen (fich_I, "r");
      if (fpI == NULL) 
      {     
         fprintf (stderr,"IMPOSSIBLE D'OUVRIR LE FICHIER %s\n",fich_I);
         exit (1);
      }  
   /* Nom du Fichier de sotie Anormal*/

   printf ("\nNom du fichier de sortie ANORMAL : ");
   gets (fich_A) ;
   fpA = fopen (fich_A, "w+");
      if (fpA == NULL) 
      {     
         fprintf (stderr,"IMPOSSIBLE DE CREER LE FICHIER %s\n",fich_A);
         exit (1);
      }  
   /* Nom du Fichier de sotie Normal*/

   printf ("\nNom du fichier de sortie NORMAL: ");
   gets (fich_N) ;
   fpN = fopen (fich_N, "w+");
      if (fpN == NULL) 
      {     
         fprintf (stderr,"IMPOSSIBLE DE CREER LE FICHIER %s\n",fich_N);
         exit (1);
      }  
	
	strcpy(ligne1,"");  strcpy(ligne2,""); strcpy(ligne3,""); 
	fin_fich_I = fgets (ligne1, LONG_BUF, fpI); // Entrée prenmière ligne
	fin_fich_I = fgets (ligne2, LONG_BUF, fpI); // Entrée deuxièmeligne
	fin_fich_I = fgets (ligne3, LONG_BUF, fpI); // Entrée troisième ligne
	while (fin_fich_I!=NULL)
	   {
	   p=instr(ligne3,"anormal");
	   if (p>=0) {
		   fputs (ligne1,fpA);
	           fputs (ligne2,fpA);
		   fputs (ligne3,fpA);
		}
	   else {
		   fputs (ligne1,fpN);
	           fputs (ligne2,fpN);
	           fputs (ligne3,fpN);
		}
		fin_fich_I = fgets (ligne1, LONG_BUF, fpI); // Entrée prenmière ligne
	        fin_fich_I = fgets (ligne2, LONG_BUF, fpI); // Entrée deuxièmeligne
	        fin_fich_I = fgets (ligne3, LONG_BUF, fpI); // Entrée troisième ligne
		}
	fclose(fpI); fclose(fpA); fclose(fpN);
	printf("\nEclatement du fichier %s termine\n",fich_I);
	printf("Appuyez sur une touche...");
	getch();
return 0;
}
	
int instr (chaine , sous_chaine)
char *chaine;
char *sous_chaine;
{
   int l , m , n ,i ,j ;
   l = strlen(chaine);
   m = strlen(sous_chaine);
   n = -1;
   if ((m > l) || (m == 0) || (l == 0)) return(n);
   j = -1;
   while (j<l)
   { 
    i = 0; j = j+1; 
    while ((sous_chaine[i]==chaine[j]) && (i<m) && (j<l))
      {
        i = i+1; j = j+1;
      }
      if ( i == m)
         {
          n = j-m;
          return(n);
         }
   }
return(n);
}


A+.
0
Montréalois
9 mai 2008 à 17:17
Merci amigo pour ton aide, en fait j'ai fait un p'tit code (en java) , et ça marche normalement;
le voila:

import java.io.*;

public class AfficheFichier {

static void affiche(String nomFichier) {
try {
FileReader fr = new FileReader(nomFichier);
BufferedWriter buff = new BufferedWriter(new FileWriter("C:/........../NORMAL.txt"));
BufferedWriter buff2 = new BufferedWriter(new FileWriter("C:/........./ANORMAL.txt"));
int lu=1;
char c;
int compt=0;
String s="";
while (lu != -1)
{
lu = fr.read();
if (lu == ',')compt++; // si le caractere lu est une virgule, on passe
if(compt==41) // jusqu'au derniere virgule, je suis à la derniere collonne (Normal/Anormal)
{
String TypeAttaque=""; // chaine de caracteres qui sert a tester le type
int p;
p=fr.read();

while(p!='.'){
TypeAttaque=TypeAttaque+(char)p; // lire la derniere collonne
p=fr.read();}

s+=',';
s+=TypeAttaque+'.';
if(TypeAttaque.equals("normal")){buff.write(s);buff.newLine();}
else {buff2.write(s);buff2.newLine();}
compt=0;
s="";

// break;

lu = fr.read();

}


c = (char) lu;
s+=c;

}
buff.close();
buff2.close();
fr.close();
System.out.println("END");
} catch (FileNotFoundException e) {
System.out.println("Impossible de lire le fichier "
+nomFichier+" !");
} catch (IOException e) {
System.out.println("Erreur de lecture !");
}
}

public static void main(String [] args) {

String nom="C:/.............................../nondufichieràeclater";
affiche(nom);
}
}

Merci encore une fois, et à Dudypunk pour sont algorithme.
A+
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83 > Montréalois
9 mai 2008 à 20:54
C'est normal.
N'oublie pas de marquer ton problème "résolu"
0