Matlab - Solucion a lectura de archivo csv con datos numericos y caracteres

 
Vista:
sin imagen de perfil

Solucion a lectura de archivo csv con datos numericos y caracteres

Publicado por miguel concha (17 intervenciones) el 02/04/2015 17:43:23
Hace una semana publique un problema con archivos csv con lineas de texto al comienzo y luego datos nuemricos, la idea era separar estos datos numericos a una matriz ue los contuviera, pero ademas que lo hiciera con varios archivos al mismo tiempo, generando un solo archivo de salida.
El problema es bastante completo y le subo mi solución por si le sirve a alguien parte de este.

Muchas gracias por su web.


% este programa lee un set de archivos csv que no poseen estructura de
% matriz cuadrada hasta la linea 96 (linea 97 encabezado),
clear all
clc

format long % aumento cantidad de decimales

path='aqui ingresan el directorio'; %abre el directorio donde se encuentran los archivos
list = dir([path,'/*.csv']);% crea una lista con los nombres de los archivos con extencion csv del directorio

dim=length(list);% cantidad de archivos

s=0;
for i=1:2

%disp( list( i ).name )% despliega la lista
archivo=list(i).name% leo el nombre del archivo a utilizar
entrada=fopen(archivo,'r')% abre archivo csv de la lista


% leemos las primeras 96 lineas sin hacer nada, para comenzar trabajar
% desde el encabezado
for i=1:96

borrar=fgetl(entrada); % eliminando lineas que no deseamos, en realidad las lee y no hace nada hasta la 96

end



encabezado=fgetl(entrada);% guardamos linea encabezado, linea 97


%lectura de lineas desde 98 en adelante

%%%%%%%%%%%%%% contamos las lineas del archivo (no es lo mismo que leerlas
%%%%%%%%%%%%%% simplemente de una matriz ya q no es cuadrada)

fid = fopen(archivo,'r');
count = 0;
while ~feof(fid)
line = fgetl(fid);
if isempty(line) || strncmp(line,'%',1) || ~ischar(line)
continue
end
count = count + 1;
end
fprintf('%d lines\n',count);
fclose(fid);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
p=count;
numfilas=p+2; % nuemro de filas de cada archivo, sirve para comprobar si lee el archivo
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

for j=1:(numfilas-97)

fila=str2num(fgetl(entrada));% cambiamos texto por numeros, ya que el
%archivo no es matriz, posee comas para separar

for k=1:72 % guardamos las columnas en un arreglo matricial para luego
%poder manipularlos, son 74 columnas pero estas al estar en
%formato fecha en la operacion anterior se desconfiguarn y de 2 columnas pasan a ser 10

elemento=fila(1,k);
x=s+j;
matriz(x,k)=elemento; % genero una matriz con las filas de cada archivo

end


end
[s,p]=size(matriz) ;% dmensiones de la matriz, nos interesa el numero de filas para saber donde iniciar el guardado del siguiente archivo csv
end
%save matriz;
%%%%%%%%%% convierte la matriz en archivo de salida
[n,m]=size(matriz);
fileout=fopen('salida.xls','w');

%Aqui

for i=1:n
for j=1:m
fprintf(fileout,'%4.6f\t',matriz(i,j));
end
fprintf(fileout,'\n');
end


%%% para agregar un encabezado para 72 columnas estoy intentando con esto para hacerlo mas agil, esto iria donde puse Aqui, pero esta en proceso XD

[token,remain]=strtok(encabezado,',');
palabras{1}=token;

for i=1:73
[token,remain]=strtok(remain,',');
j=i+1;
palabras{j}=token;
end
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder