% separa un fichero de datos en conjunto de entrenamiento y conjunto de test
% f_orig, f_entr, f_test: nombres de ficheros
% n_ej: numero de ejemplos a guardar en el conjunto de entrenamiento
function separa(f_orig, f_entr, f_test, n_ej)


% cuenta el numero total de datos
n_dat = cuenta_arff(f_orig);

% separa aleatoriamente ejemplos
test(1:n_dat)=1;
orden = randperm(n_dat);
for i=1:n_ej
    test(orden(i))=0;
end

% escribe nuevos ficheros
file_o = fopen(f_orig, 'r');
file_e = fopen(f_entr, 'w');
file_t = fopen(f_test, 'w');

% duplica lineas hasta el comienzo de los datos
seguir=1;
while seguir==1
   cadena = fgets(file_o);
   fprintf(file_e, '%s', cadena);
   fprintf(file_t, '%s', cadena);
   carac = size(cadena);
   if (carac(2)>=5)
      if cadena(1:5)=='@data' | cadena(1:5)=='@DATA'
         seguir=0;
      end
   end
end

% escribe una linea en blanco en cada fichero
fprintf(file_t, '\n');
fprintf(file_e, '\n');

% cada linea no en blanco la escribe en uno de los dos ficheros
i = 0;
seguir=1;
while seguir==1
   cadena = fgets(file_o);
   if cadena==-1
       seguir=0;
   elseif (length(cadena)>2)    
       i = i + 1;
       if test(i)
           fprintf(file_t, '%s', cadena);
       else
           fprintf(file_e, '%s', cadena);
       end
   end
end

fclose(file_o);
fclose(file_e);
fclose(file_t);

return


% cuenta el numero de ejemplos de un fichero arff
function num_datos = cuenta_arff(fichero)

file = fopen(fichero, 'r');

% busca el comienzo de los datos
seguir=1;
while seguir==1
   cadena = fgets(file);
   if (length(cadena)>=5)
      if cadena(1:5)=='@data' | cadena(1:5)=='@DATA'
         seguir=0;
      end
   end
end

% cuenta lineas no en blanco
num_datos = 0;
seguir=1;
while seguir==1
   cadena = fgets(file);
   if cadena==-1
       seguir=0;
   elseif (length(cadena)>2)
       num_datos = num_datos + 1;
   end
end

fclose(file);

return
   
       

