Recuperer des chemin de fichier et analyser ces fichiers

Résolu/Fermé
poparnassus
Messages postés
419
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
- 25 juin 2017 à 14:31
yg_be
Messages postés
20039
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 août 2022
- 25 juin 2017 à 22:06
Bonjour,

J'essaye de faire un programme d"Analyse de fichier log: Mon objectif est de maitriser la manipulation de fichier, de chaine de caractere Etc...

Exemple de ligne de mes fichier LOG:
2016-02-15	17:57:01	info	SRV-NAS	user	Connection	Event: read, Path: /Logiciels/Logiciels/WINDOWS/Editeur hexadecimal/HxD Hex Editor 1.7.7.0 [Portable] Editeur Hexadécimal FR/HxD.exe, File/Folder: File, Size: 3.31 MB, User: XXXX, IP: 192.168.50.11


Pour info, mon code m'a donner pour reslutat: 420 356 241 221 de lignes
Pour 40go
Bref,

Voici le code que j'ai fait, qui m'a permis de déduire que maintenant, je dois trouver une methode pour:
- faire une copy de mon dossier log quelque part
- stocker le path dans un tableau dans une structure, avec un identifiant personnaliser (nom du fichier, ou numerotation peut importe)., du chemin de la copy et du chemin original
- scanner les fichiers .txt de mon nouveau dossier donc, crée une fonction pour analyser fichier par fichier, fonction qui devra supprimer les lignes que je ne veux pas garder, donc qui ont pour IP: 192.168.XXX.XXX, je conserve uniquement les IP publique


Actuellement, j'ai besoin d'aide pour:
- Analyser et stocker le chemin d'acces de mes fichier .txt dans un tableau
- Avec la fonction getc() et strcpy ?? regrouper les caracteres compris entre deux ","
2016-02-15	17:57:01	info	SRV-NAS	user	Connection	Event: read


Je ne connaissais pas la fonction getc()
        
while ((c = getc(FichierLog->fichier_log2)) != EOF)
{
if (c == '\n')
++FichierLog->nb_ligne2;
printf("c: %s",c);
systeme("PAUSE");
}
Donc j'ai glisser un print() et pause pour voir ce qui se passer, et donc, a chaque tour de boucle je voix tout les caracteres de mon fichier log defiler, donc j'en deduit que c'est a ce niveau la que je dois regrouper mes caractere qui sont entourer par des "," mais comment ? avec
strcat
ou
strncat




main.c
#include "prototype.h"

int main(int argc, char *argv[])
{
    printf(".......Analyse de fichier log.......\n\n");

    //Structure
    FichierLog FichierLog;

    methode_1(&FichierLog);

    return 0;
}



methode_1.c
#include "prototype.h"

void methode_1(FichierLog *FichierLog)
{
        FichierLog->fichier_log1 = fopen("./LOG/ArchiveLog/Archive_LOG/local/2016-01-16_2016-02-15.TXT","r");

        //Jouvre mon fichier et ci dessous je compte les lignes
        if (FichierLog->fichier_log2 != NULL)
    {
        int c;
        FichierLog->nb_ligne2 = 0;

        //Comptage des lignes
        while ((c = getc(FichierLog->fichier_log2)) != EOF)
        {
            if (c == '\n')
                ++FichierLog->nb_ligne2;
        }

        //RESULTAT
        printf("Nombre de ligne: %d \n\n",FichierLog->nb_ligne2);

        fclose(FichierLog->fichier_log2);
    }
    else
    {
        printf("Impossible d'ouvrir le ficier log2");
    }

/*
J'ai reproduit le code ci-dessus pour chaque fichier log donc 16Fois. METHODE NUL ET  CHIANTE ET TELLEMENT LONGUE !!! ^^
*/
}


prototpe.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct FichierLog FichierLog;
struct FichierLog
{
int nb_ligne1;
FILE* fichier_log1;

int nb_ligne2;
FILE* fichier_log2;

int nb_ligne3;
FILE* fichier_log3;

int nb_ligne4;
FILE* fichier_log4;

int nb_ligne5;
FILE* fichier_log5;

int nb_ligne6;
FILE* fichier_log6;

int nb_ligne7;
FILE* fichier_log7;

int nb_ligne8;
FILE* fichier_log8;

int nb_ligne9;
FILE* fichier_log9;

int nb_ligne10;
FILE* fichier_log10;

int nb_ligne11;
FILE* fichier_log11;

int nb_ligne12;
FILE* fichier_log12;

int nb_ligne13;
FILE* fichier_log13;

int nb_ligne14;
FILE* fichier_log14;

int nb_ligne15;
FILE* fichier_log15;

int nb_ligne16;
FILE* fichier_log16;
};


void methode_1(FichierLog *FichierLog);




1 réponse

yg_be
Messages postés
20039
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 août 2022
1 196
Modifié le 25 juin 2017 à 15:48
bonjour,
je suggère d'utiliser fgets, et pas getc.
as-tu déjà utilisé des tableaux et des structures?
je suggère:
struct FichierLog
{
    int nb_ligne;
    FILE* fichier_log;
}

struct FichierLog fichiers[16];

je pense que ce serait plus simple de traiter un fichier à la fois:
- découvrir un fichier log
- parcourir ce fichier, et enregistrer les lignes intéressantes dans un nouveau fichier
- passer au fichier log suivant
0
poparnassus
Messages postés
419
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
30
25 juin 2017 à 16:05
les structures oui, les tableaux tout simple oui, mais des tableaux a plusieurs dimension non:

En faite si je comprends bien, il faut faire un premier tableau stocker dans une structure, pour qu'il soit accesible depuis toute mes fonctions:

C0: indice
C1: Chemin d'acces du fichier original
C2: Nbr de ligne
C3: Chemin d'acces du fichier copier
C4; Nbr de ligne

Le nombre de x ligne pour le nombre de fichier log trouver.


prototype.h
//Ca ne compile pas avec x_log par contre si je mets un chiffre oui. Mais comment je dois faire vu que C1 est de type char et C2 est de type int ...
typedef struct PATH_LOG PATH_LOG ;
struct PATH_LOG
{
int tableau_1[x_log][x_log][x_log][x_log][x_log];
};



si je veux un tableau de 7 colonne et de n ligne, où n est definie par la boucle while et stocker dans la variable nb_ligne:

while ((lecture = getc(FichierLog->fichier_log1)) != EOF)
{
if (lecture == '\n')
++FichierLog->nb_ligne1;
}






//j'initialise mon tableau, de cette maniere ???
int tableau[n_log1][n_log1][n_log1][n_log1][n_log1][n_log1][n_log1] = {0},{0},{0},{0},{0},{0},{0};

0
poparnassus
Messages postés
419
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
30
25 juin 2017 à 16:13
ah ok je crois que je viens de comprendre: (javais pas vu ton code)

Oui cest plus judicieu de traiter un fichier, et puispasser au suivant
0
poparnassus
Messages postés
419
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
30
25 juin 2017 à 16:27
Comment je peux trouver le PATH de mes fichier log ?
0
yg_be
Messages postés
20039
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 août 2022
1 196 > poparnassus
Messages postés
419
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019

25 juin 2017 à 16:52
vois ici:
https://openclassrooms.com/courses/parcourir-les-dossiers-avec-dirent-h
0
poparnassus
Messages postés
419
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
30
Modifié le 25 juin 2017 à 19:09
ok merci jai compris, par contre je n'arrive pas à affecter le nom de mes fichier contenu dans d_name à ma structure FICHIER_LOG fichier_log[100];
  • EDIT: J'ai modifier un truc, ma fonction methode_2() m'affiche bien mon nombre de ligne

prototype.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

//typedef struct PATH_LOG PATH_LOG;
typedef struct FICHIER_LOG FICHIER_LOG ;
    struct _ORIGINE
    {
        int nb_line;
        FILE* fichier_log;
    };

    struct _COPY
    {
        int nb_line;
        FILE* fichier_log;
    };

struct FICHIER_LOG
{
    struct _COPY _copy[100];
    struct _ORIGINE _origine[100];
};

void methode_2(FICHIER_LOG *fichier_log]);
void init_methode_2(FICHIER_LOG *fichier_log);


main.c
#include "prototype.h"

int main(int argc, char *argv[])
{
    printf(".......Analyse de fichier log.......\n\n");

    FICHIER_LOG fichier_log;
    init_methode_2(&fichier_log);
    
    DIR* folder = NULL;
    struct dirent* fichierLu = NULL;
    folder = opendir("C:\\Users\\AZOTE\\Desktop\\Archive_LOG\\Archive_LOG\\local");

    char *p;
    int i=0;

    while ((fichierLu = readdir(folder)) !=NULL)
    {
        i++;
        p = strrchr(fichierLu->d_name, '.');
        if(p && !strcmp(p, ".TXT"))
            printf("i= %d :%s \n",i, fichierLu->d_name);
           fichier_log._origine[i].fichier_log = fichierLu->d_name ;
    }


        printf(" %ld \n",fichier_log._origine[i].fichier_log); // Ici j'ai "0" comme resultat ... Comprend pas là ou je me trompe


    methode_2(&fichier_log);

    return 0;
}



methode_2.c
#include "prototype.h"

void init_methode_2(FICHIER_LOG *fichier_log)
{
    int i;
    for(i=0 ; i<100 ; i++)
    {
        fichier_log->_origine[i].fichier_log = NULL;
        fichier_log->_origine[i].nb_line = 0;
        fichier_log->_copy[i].fichier_log = NULL;
        fichier_log->_copy[i].nb_line = 0;
    }
}

void methode_2(FICHIER_LOG fichier_log[100])
{

    fichier_log[0]._origine.fichier_log = fopen("./LOG/ArchiveLog/Archive_LOG/local/2016-01-16_2016-02-15.TXT","r");

    //
        if (fichier_log[0]._origine.fichier_log != NULL)
    {
        int lecture;
        fichier_log[0]._origine.nb_line = 0;

        //Comptage des lignes
        while ((lecture = getc(fichier_log[0]._origine.fichier_log)) != EOF)
        {
            if (lecture == '\n')
                ++fichier_log[0]._origine.nb_line;

            //printf("Ligne: %d lecture:%c \n",FichierLog.nb_ligne,lecture);
            //system("CLS");
            //system("PAUSE");
        }

        //RESULTAT
        printf("Nombre de ligne: %d \n\n",fichier_log[0]._origine.nb_line);
/*
        char dest[250];
        while ((c = getc(fichier_log)) != EOF)
        {
            strcat(dest,c);
            if (c == "")
            break;

        }
*/
        fclose(fichier_log[0]._origine.fichier_log);
    }
    else
    {
        printf("Impossible d'ouvrir le ficier log1");
    }

}


0