[FoLUG] Compiti di fine anno

Michele Mordenti michele.mordenti@gmail.com
Gio 31 Dic 2009 08:36:57 CET


Il 30 dicembre 2009 17.24, Alessandro Ronchi
<alessandro.ronchi@soasi.com> ha scritto:
> questo dovrebbe funzionare.
> Dovrei avere il file per capire meglio se è performante o meno.
> Se hai una tabella ORACLE certamente ti posso trovare l'output più
> velocemente, ma immagino che non sia così semplice altrimenti non l'avresti
> già scartata come ipotesi.
>
>
> fileHandle = open ( 'test.txt', 'r' )
> males = open ('m.txt', 'w')
> females = open ('f.txt', 'w')
>
> for line in f.xreadlines():
>    sex = line[72]
>    if sex == "M":
>        males.write(line)
>    elif sex == "F":
>        females.write(line)


Perchè non scrivere un bel filtro C come ai vecchi tempi:
terminale nero, caratteri verdi, emacs, gcc e un po' di prurito alle mani:
(p.s.: lo avevo omesso, ma le righe sono lunghe al massimo 226 caratteri)

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

#define BUFFER_LEN 255

int main(int argc, char *argv[]) {
    FILE *rfile,*wfile;
    char buffer[BUFFER_LEN];
    char *fileSource, *fileTarget, *postfisso;
    char marker;
    int column;

    if (argc!=4) {
        printf("Uso:\n\t %s marker colonna filesorgente\n",argv[0]);
        return 1;
    }

    marker = argv[1][0];
    column = atoi(argv[2]);
    fileSource = strdup(argv[3]);
    postfisso = (char *) malloc(4*sizeof(char));
    fileTarget = (char *)
malloc((sizeof(fileSource)+sizeof(postfisso))*sizeof(char));
    strcpy(fileTarget,fileSource);
    postfisso[0]='_';
    postfisso[1]='_';
    postfisso[2]=marker;
    postfisso[3]='\0';
    strcat(fileTarget,postfisso);

    /* DEBUG
    printf("File sorgente: %s\n",fileSource);
    printf("File destinazione: %s\n",fileTarget);
    printf("marker: %c\ncolonna: %i\n", marker,column);
    */

    rfile = fopen(fileSource,"r");
    wfile = fopen(fileTarget,"w");

    if (rfile == NULL ){
        printf("Errore apertura file %s.\n",fileSource);
        return -1;
    }
    if (wfile == NULL ){
        printf("Errore apertura file %s.\n",fileTarget);
        return -1;
    }

    // fgets() restituisce un puntatore nullo alla fine del file.
    while ( fgets(buffer,BUFFER_LEN,rfile) ) {
        if(buffer[column] == marker){
            fputs(buffer,wfile);
        }
    }
    printf("Controlla il file %s\n",fileTarget);
    fclose(rfile);
    fclose(wfile);
    free(fileSource);
    free(fileTarget);
    free(postfisso);
    return 0;
}


-- 
Michele Mordenti
http://michelemordenti.netsons.org


Maggiori informazioni sulla lista FoLUG