1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| #include <stdio.h>
// Taille fichier
unsigned long size_fic(FILE *f)
{
unsigned long size;
unsigned long pos;
// Mémorisation position courante
pos=ftell(f);
// Positionnement fin fichier et récupération taille
fseek(f, 0, SEEK_END);
size=ftell(f);
// Repositionnement position initiale
fseek(f, pos, SEEK_SET);
// Renvoi taille trouvée
return size;
}
// Compteur de colonnes
unsigned long cpt_col(FILE *f, char delim)
{
int c;
unsigned long col;
unsigned long pos;
// Mémorisation position courante
pos=ftell(f);
// Rembobinage initial
rewind(f);
// Lecture du fichier
col=0;
while ((c=fgetc(f)) != EOF)
{
// Si on atteint un délimiteur de colonne ou une fin de ligne
if (c == delim || c == '\n')
{
// Une colonne de plus
col++;
// Si on atteint la fin de ligne
if (c == '\n')
// On a fini de compter
break;
}
}
// Repositionnement position initiale
fseek(f, pos, SEEK_SET);
// Renvoi nb colonnes trouvées
return col;
}
// Extraction et écriture d'une colonne X
void write_col(
FILE *f1,
FILE *f2,
unsigned long col,
char delim,
unsigned long size)
{
int c;
unsigned long nzone;
unsigned long pos;
// Rembobinage initial
rewind(f1);
// Itération sur le nb de caractères du fichier
nzone=1;
for (pos=1; pos <= size; pos++)
{
// Lecture caractère
c=fgetc(f1);
// Si on a atteint un délimiteur de zone
if (c == delim || c == '\n')
{
// Le n° de zone augmente
nzone++;
// Si on atteint la fin de la ligne
if (c == '\n')
{
// Si on n'est pas à la fin du fichier
if (pos != size)
{
// Ecriture délimiteur
fputc(delim, f2);
// Réinitialisation zone pour ligne suivante
nzone=1;
}
else
// Ecriture fin de ligne
fputc('\n', f2);
}
// Il ne faut pas stocker le délimiteur
continue;
}
// Si le n° de zone correspond à la colonne demandée
if (nzone == col)
// On écrit le caractère dans le fichier
fputc(c, f2);
}
}
int main(int argc, char *argv[])
{
FILE *f1;
FILE *f2;
unsigned long i;
unsigned long ncol;
unsigned long sz_fic;
f1=fopen(argv[1], "r");
f2=fopen(argv[2], "w");
sz_fic=size_fic(f1);
ncol=cpt_col(f1, '\t');
for (i=1; i <= ncol; i++)
write_col(f1, f2, i, '\t', sz_fic);
fclose(f1);
fclose(f2);
} |
Partager