Avatar billede steffen-k Nybegynder
13. maj 2008 - 09:45 Der er 8 kommentarer og
1 løsning

Åben fil og søg efter bestemte events/linier

Hello fellows,

Jeg sidder med et problem med at søge og sortere bestemte linier i en DHCP log fil.
Jeg har formået at åbne filen og lukke filen. Jeg er kun interesseret i linierne renew i første omgang. For at søge efter en bestemt linie har jeg skrevet:

fscanf(fprtr1, "11, %d/%d/%d, %d:%d:%d, Renew\n", filename1, &mdr, &day, &year, &hour, &minutes, &sec

Og for at skrive linien ud til en fil har jeg skrevet:

fprintf(fprtr8, "11, %d/%d/%d, %d:%d:%d, Renew\n", filename8, &mdr, &day, &year, &hour, &minutes, &sec

Nogen der har en idé til problemet eller en mere kvalificeret løsning?

/ Steffen
Avatar billede arne_v Ekspert
13. maj 2008 - 15:23 #1
Du laeser alle linier ind med et format hvor action f.eks. "renew" laeses ind
i et char array og saa tester du om den indeholder "renew" med strcmp.
Avatar billede steffen-k Nybegynder
14. maj 2008 - 08:53 #2
Hej igen, vi har den DHCP log i formatet .csv, hvor vi gerne vil have alle linier med "ID" 10 og 11 overført til en anden fil. Vil du give et eksempel på nedenstående log? ;-)

ID, DATE, TIME, DESCRIPTION, IP, ADRESS, HOST NAME, MAC ACDRESS

00, 05/07/08, 09:59:36, Started,,,,
11, 05/07/08, 09:59:48, Renew, 192.168.100.5, klient.xxx.xxx.dk, 00508df15dec
Avatar billede arne_v Ekspert
14. maj 2008 - 16:51 #3
Hvis der altid staar noget mellem kommaerne:

#include <stdio.h>

#define MAX_ACTION_LEN 100
#define MAX_NAME_LEN 100

struct logrec
{
    int id;
    int dd,mon,yy;
    int hh,min,ss;
    char action[MAX_ACTION_LEN];
    char ipnum[16];
    char ipnam[MAX_NAME_LEN];
    char mac[13];
};

typedef struct logrec LOGREC;

int main()
{
    FILE *fp;
    LOGREC rec;
    fp = fopen("dhcp.log", "r");
    while(fscanf(fp, "%2d, %2d/%2d/%2d, %2d:%2d:%2d, %[^,], %[^,], %[^,], %s",
                &rec.id, &rec.dd, &rec.mon, &rec.yy, &rec.hh, &rec.min, &rec.ss,
                rec.action, rec.ipnum, rec.ipnam, rec.mac) > 0)
    {
        printf("%d %d %d %d %d %d %d %s %s %s %s\n",
              rec.id, rec.dd, rec.mon, rec.yy, rec.hh, rec.min, rec.ss,
              rec.action, rec.ipnum, rec.ipnam, rec.mac);
        if(rec.id == 10 || rec.id == 11) printf("Ovenstaaende skal udskrives !\n");
    }
    fclose(fp);
}
Avatar billede arne_v Ekspert
14. maj 2008 - 16:52 #4
Hvis der altid er et mellemrum mellem kommaerne:

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

#define MAX_ACTION_LEN 100
#define MAX_NAME_LEN 100

struct logrec
{
    int id;
    int dd,mon,yy;
    int hh,min,ss;
    char action[MAX_ACTION_LEN];
    char ipnum[16];
    char ipnam[MAX_NAME_LEN];
    char mac[13];
};

typedef struct logrec LOGREC;

int main()
{
    FILE *fp;
    LOGREC rec;
    char tmp[MAX_ACTION_LEN+16+MAX_NAME_LEN+13];
    fp = fopen("dhcp2.log", "r");
    while(fscanf(fp, "%2d, %2d/%2d/%2d, %2d:%2d:%2d, %[^\n]",
                &rec.id, &rec.dd, &rec.mon, &rec.yy, &rec.hh, &rec.min, &rec.ss, tmp) > 0)
    {
        strcpy(rec.action, strtok(tmp, ","));
        strcpy(rec.ipnum, strtok(NULL, ",")+1);
        strcpy(rec.ipnam, strtok(NULL, ",")+1);
        strcpy(rec.mac, strtok(NULL, ",")+1);
        printf("%d %d %d %d %d %d %d %s %s %s %s\n",
              rec.id, rec.dd, rec.mon, rec.yy, rec.hh, rec.min, rec.ss,
              rec.action, rec.ipnum, rec.ipnam, rec.mac);
        if(rec.id == 10 || rec.id == 11) printf("Ovenstaaende skal udskrives !\n");
    }
    fclose(fp);
}
Avatar billede arne_v Ekspert
14. maj 2008 - 16:58 #5
Hvis der virkeligt bliver indsat mellemrum foran vaerdier men ikke mellemrum foran
timme vaerdier, saa skal du bruge fgets og parse linien.
Avatar billede steffen-k Nybegynder
19. maj 2008 - 10:17 #6
Hej igen, tak for løsningerne. Det var en fejl, jeg havde lavet mellemrum mellem kommaerne...

Inden du postede disse løsninger har vi udarbejdet en anden løsning, som du kan se her. Du må gerne kommentere evt. åbenlyse fejl eller mangler. Eller selvfølgelig dårlig sprog eller programmering.


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

//prototyper
void ErrorMsg(char *str);
void process_file(char *infilename, FILE *outfile);
//enum {SUCCESS, FAIL, MAX_LEN = 80};

main(void)
{
//Opretter fil pointerer
FILE *fptr_out;

//Åben "Dhcplogout" for skrivning
if ((fptr_out = fopen("dhcplogout.csv", "w")) == NULL)
    {
    ErrorMsg("dhcplogout");
    }
        //Åben, indfiler . Skriv, luk
        process_file("DhcpSrvlog-Mon.log", fptr_out);
        process_file("DhcpSrvlog-Tue.log", fptr_out);
        process_file("DhcpSrvlog-Wed.log", fptr_out);
        process_file("DhcpSrvlog-Thu.log", fptr_out);
        process_file("DhcpSrvlog-Fri.log", fptr_out);
        process_file("DhcpSrvlog-Sat.log", fptr_out);
        process_file("DhcpSrvlog-Sun.log", fptr_out);
fclose(fptr_out);
}

void process_file(char *infilename, FILE *outfile)    // Åbner filen infilename - gennemlæser for 10 og 11
                                                // i start af linie - udskriver til outfile
{
FILE *fptr_in;
    if ((fptr_in = fopen(infilename, "r")) == NULL)
        ErrorMsg(infilename);
    else
    {   
        int n;
        char tmp[256]={0x0};
        for (n=0; n<=30; n++)
            fgets(tmp,sizeof(tmp),fptr_in);
       
        while(fgets(tmp,sizeof(tmp),fptr_in)!=NULL)
        {
            int testvalue=atoi(tmp);  /* atoi stops translating to an int
                                      when it hits a blank */
            if(testvalue==10)
                fputs(tmp,outfile);
               
            if(testvalue==11)
                fputs(tmp,outfile);
        }
        fclose(fptr_in);
    }
}

// Fejl meddelelse
void ErrorMsg()
{
//fprintf ("Fejl under læsning af filen");
}
Avatar billede arne_v Ekspert
01. juni 2008 - 04:17 #7
while(fgets(tmp,sizeof(tmp),fptr_in)!=NULL)
        {
            int testvalue=atoi(tmp);  /* atoi stops translating to an int
                                      when it hits a blank */
            if(testvalue==10)
                fputs(tmp,outfile);
             
            if(testvalue==11)
                fputs(tmp,outfile);
        }

kunne måske laves som:

        while(fgets(tmp,sizeof(tmp),fptr_in))
        {
            if(strlen(tmp) >= 2 && tmp[0] == '1' && (tmp[1] == '0' || tmp[1] == '1')
                fputs(tmp,outfile);
        }

men ellers har jeg ikke nogen kommentarer.
Avatar billede arne_v Ekspert
30. august 2008 - 02:01 #8
OK ?
Avatar billede arne_v Ekspert
28. oktober 2008 - 03:15 #9
?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester