/**
Converte arquivos de entrada Expert
para arquivos compatíveis com entrada
do SVM^light e suas variações.
**/
# include <stdio.h>
typedef struct svmdata { // struct por ser parâmetro natural pra string...
char campo[500][500];
} SVMDATA;
int converte(char*,char*,char*);
const unsigned int TAMANHO_LINHA = 15000;
int converte(char* in, char* out, char* comp)
{
FILE *infile; // primeiro parametro da linha de comando
FILE *outfile; // segundo parametro da linha de comando
infile = fopen(in, "r");
outfile = fopen(out, "w");
int i,k; // i para percorrer linha e k para marcar numero de campos
SVMDATA entrada;
char linha[TAMANHO_LINHA],target[3],compara1[100],compara2[100];
fgets(linha,TAMANHO_LINHA,infile);
fprintf(outfile,"#%s #%s",comp,linha); // nao trata primeira linha (comentario?)
while ( !feof(infile)) // começa a varrer arquivo
{
fgets(linha,TAMANHO_LINHA,infile); //lê a linha do arquivo texto
i=0; // indice pra varrer linha.
k=0; // indice para marcar campo
if (!(strcmp(linha,"\n"))) continue; //verifica se tem linha vazia
while (linha[i] != '\0')
{
if ((linha[i] == 9) || (linha[i] == 32)) // se char é tab ou espaço
k++; // vai pra proximo campo...
else
{
char novalinha[2]="";
novalinha[0]=linha[i];
strcat(entrada.campo[k],novalinha); // ...senão adiciona ao campo atual
}
i++; // proximo char da linha
}
strcpy(compara1,comp);
strcpy(compara2,comp);
strcat(compara1,"\n");
if (strcmp(entrada.campo[k],compara1) && strcmp(entrada.campo[k],compara2))
strcpy(target,"+1");
else
strcpy(target,"-1");
fprintf(outfile,target); //compara comp com ultimo campo e define target
int id;
for (id=1;id<k;id++)
fprintf(outfile," %d:%s",id,entrada.campo[id]); // grava cada id:campo
fprintf(outfile,"\n"); // prox linha
int zera;
for (zera=0;zera<=k;zera++)
strcpy(entrada.campo[zera],""); //zera os campos
}
fclose(outfile);
fclose(infile);
}