Matlab - Difícil cadena de control para 'fscanf'

 
Vista:

Difícil cadena de control para 'fscanf'

Publicado por Aura (33 intervenciones) el 19/03/2011 11:49:44
Mis datos tienen este formato:

DATE,GPS_TIME,GPS_FIX,WGS84_LON,WGS84_LAT,WGS84_ALT,WGS84_HAE,SPEED_KPH,STATION_ID,REMARK,AUX_X0,AUX_X1,AUX_X2,AUX_X3,AUX_X4,AUX_X5,AUX_X6,AUX_X7,AUX_X8,AUX_X9,AUX_X10,AUX_X11,AUX_X12
110203,120246,20915,-5.1281957,36.8708692,800.8,849.65,0.1,126,,$PDLMA,+12.67,+23.4,+0.3,+4.9,,,,,,,,
110203,120247,20915,-5.1281957,36.8708692,800.79,849.64,0,126,,$PDLM1,130307,+14.1,+1.37,+16.6,+0.60,,,,,,,
110203,120248,20915,-5.1281963,36.8708696,800.65,849.5,0.1,126,,$PDLM1,130308,+14.1,+1.37,+16.9,+0.60,,,,,,,
110203,120249,20915,-5.1281963,36.8708697,800.64,849.49,0.1,126,,$PDLM1,130309,+14.2,+1.37,+16.4,+0.60,,,,,,,
110203,120250,20915,-5.1281963,36.8708696,800.64,849.48,0,126,,$PDLM1,130310,+14.2,+1.37,+16.4,+0.60,,,,,,,
110203,120251,20915,-5.1281964,36.8708694,800.7,849.55,0,126,,$PDLM1,130311,+14.1,+1.38,+16.5,+0.60,,,,,,,

(NOTA: A PARTIR DE LA FILA SIGUIENTE ME INTERESAN LOS DATOS)

110203,120251.37,,,,,,,,,$PDLM2,130311,+9.6,+1.42,+15.2,+2.03,,,,,,,
110203,120251.73,,,,,,,,,$PDLMA,+12.67,+23.4,+1.0,+5.2,,,,,,,,
110203,120252.01,,,,,,,,,$PDLM1,130312,+14.0,+1.37,+16.4,+0.60,,,,,,,
110203,120252.37,,,,,,,,,$PDLM2,130312,+9.6,+1.41,+15.2,+2.03,,,,,,,
110203,120252.72,,,,,,,,,$PDLMA,+12.67,+23.4,+0.6,+4.9,,,,,,,,
110203,120253,20915,-5.1281964,36.8708693,800.71,849.56,0,126,,,,,,,,,,,,,,
110203,120253.38,,,,,,,,,$PDLM1,130313,+14.0,+1.37,+16.5,+0.59,,,,,,,
110203,120253.74,,,,,,,,,$PDLM2,130313,+9.4,+1.43,+15.2,+2.04,,,,,,,
110203,120254.09,,,,,,,,,$PDLMA,+12.67,+23.4,+0.2,+4.9,,,,,,,,

(LA SERIE DE DATOS CONTINUARÍA)

Estoy haciendo esto:

% -------
clear all
close all
clc
% Para quitar los encabezados
fid=fopen('setenilMat.txt','r');
enc=fgetl(fid); %Primera fila de encabezado
enc_2=fgetl(fid); %Segunda fila...
enc_3=fgetl(fid);
enc_4=fgetl(fid);
enc_5=fgetl(fid);
enc_6=fgetl(fid);
enc_7=fgetl(fid);
% Para decirle cómo leer los datos y cómo quiero que salga la matriz de datos
M=fscanf(fid,'%i,%f,,,,,,,,,%c,5,%f,%f,%f,%f,,,,,,,',[7,inf]);
% -------

Resultado:

1,102e+005
1,2025e+005
36

Osease, no consigo que me lo lea bien y no me da error para saber dónde está el fallo.
Muchas gracias por adelantado,
Aura.
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
Imágen de perfil de JOSE CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Difícil cadena de control para 'fscanf'

Publicado por JOSE CABALLERO (5917 intervenciones) el 21/03/2011 15:12:33
MI sugeriencia es que mejores tu pregunta, es muy vago. los datos que pones al comienzo no están muy claros, traté de pasarlo a un archivo texto, pero me faltaban algunos datos al final de algunas files.
JOSÉ CABALLERO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Difícil cadena de control para 'fscanf'

Publicado por Jorge (226 intervenciones) el 21/03/2011 10:14:44
Bueno, técnicamente está bien, ya que

110203 = 1,102e+005 y 120251,37 = 1,2025e+005

aunque seguramente no están expresados como los quieres...

Mi recomendación sería que usaras la instrucción textscan para leer toda la matriz. Tiene la opción de "headerlines" para eliminar las primeras líneas. El resultado se pondrá en un cell-array.

Es importante que consideres si quieres leer strings o números y leas el formato correspondiente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Difícil cadena de control para 'fscanf'

Publicado por Aura (33 intervenciones) el 21/03/2011 12:53:19
Gracias Jorge,
el problema no es el formato, sino que:

1,102e+005
1,2025e+005
36

estos números son los únicos resultados que obtengo al ejecutar el programa.

Tendré en cuenta tu recomendaciones,
un saludo,
Aura.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reformulo la pregunta: 'fscanf'

Publicado por Aura (33 intervenciones) el 21/03/2011 23:06:08
Buenas noches, al extraer datos de campo, recibo un fichero .txt con un encabezado de 7 filas y a continuación datos para la profundidad de 1 metro ($PDLM1), 2 metros ($PDLM2) y en superficie ($PDLMA)

110203,120251.37,,,,,,,,,$PDLM2,130311,+9.6,+1.42,+15.2,+2.03,,,,,,,
110203,120251.73,,,,,,,,,$PDLMA,+12.67,+23.4,+1.0,+5.2,,,,,,,,
110203,120252.01,,,,,,,,,$PDLM1,130312,+14.0,+1.37,+16.4,+0.60,,,,,,,
110203,120252.37,,,,,,,,,$PDLM2,130312,+9.6,+1.41,+15.2,+2.03,,,,,,,
110203,120252.72,,,,,,,,,$PDLMA,+12.67,+23.4,+0.6,+4.9,,,,,,,,
110203,120253,20915,-5.1281964,36.8708693,800.71,849.56,0,126,,,,,,,,,,,,,,
110203,120253.38,,,,,,,,,$PDLM1,130313,+14.0,+1.37,+16.5,+0.59,,,,,,,
110203,120253.74,,,,,,,,,$PDLM2,130313,+9.4,+1.43,+15.2,+2.04,,,,,,,
110203,120254.09,,,,,,,,,$PDLMA,+12.67,+23.4,+0.2,+4.9,,,,,,,,


1º) me gustaría extraer desde matlab estos datos en columnas, para poder trabajar con ellos
2º) me gustaría agrupar los datos según las tres profundidades y eliminar las demás filas

He preparado este programa:

% -------
clear all
close all
clc
% Para quitar los encabezados
fid=fopen('setenilMat.txt','r');
enc=fgetl(fid); %Primera fila de encabezado
enc_2=fgetl(fid); %Segunda fila...
enc_3=fgetl(fid);
enc_4=fgetl(fid);
enc_5=fgetl(fid);
enc_6=fgetl(fid);
enc_7=fgetl(fid);
% Para decirle cómo leer los datos y cómo quiero que salga la matriz de datos
M=fscanf(fid,'%i,%f,,,,,,,,,%c,5,%f,%f,%f,%f,,,,,,,',[7,inf]);
% -------

Pero el resultado que obtengo son sólo estos tres números:

1,102e+005
1,2025e+005
36

Gracias a todos por interesaros y gracias José por el consejo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Difícil cadena de control para 'fscanf'

Publicado por Jorge (226 intervenciones) el 21/03/2011 23:09:16
Hace tiempo alguien quería hacer algo por el estilo. Quizá te interese ver esa solución:
http://www.lawebdelprogramador.com/news/1174376/Leer_archivo_texto_formato_TM2_sin_delimitador_col.html

Aquí hay otro ejemplo acerca de la utilización de textscan:
http://www.matrixlab-examples.com/data-analysis.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reformulo la pregunta: 'fscanf'

Publicado por Aura (33 intervenciones) el 31/03/2011 18:56:46
Por favor ¿alguien puede ayudarme? no consigo trabajar con los datos en matlab.
Muchas gracias,
Aura.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Reformulo la pregunta: 'fscanf'

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 31/03/2011 19:01:02
Hola Aura.
Tengo pendiende ese tu problema. Pero hecho un programa parecido en el foro, pero no recuerdo para quien. Si lo revisas lo veras por alli.

Saludos: JOSÉ JEREMIAS CABALLERO
ASESOR DE TESIS Y PROYECTOS DONDE SE NECESITA MATLAB
PROFESOR DE MATLAB Y METODOS NUMERICOS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reformulo la pregunta: 'fscanf'

Publicado por Aura (33 intervenciones) el 31/03/2011 19:09:40
Muchísimas gracias José :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Reformulo la pregunta: 'fscanf'

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 31/03/2011 19:15:00
Mañana entro al foro nos vemos.
Saludos: JOSÉ JEREMIAS CABALLERO
ASESOR DE TESIS Y PROYECTOS DONDE SE NECESITA MATLAB
PROFESOR DE MATLAB Y METODOS NUMERICOS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasos que tengo que seguir

Publicado por Aura (33 intervenciones) el 10/04/2011 17:48:33
Hola de nuevo a todos, he estado observando el comportamiento de mis datos utilizando excel, y ahora que creo saber cómo desarrollar el programa en matlab, tengo dificultades, por eso vuelvo a la web ^_^
A continuación el código de lo que quiere empezar a ser mi programa de matlab, con los pasos a seguir comentados.
Muchas gracias a todos los que me leen y me han leído y sobretodo a los que me han ayudado anteriormente :D

% -----------------------------------------------------------------------------------------------------------------------------------
clear all
close all
clc
format bank

% INSTRUCCIONES
% 1. Marcar la primera fila como encabezado
fid=fopen('Datos.xls','r');
enc=fgetl(fid); %Primera fila de encabezado
M=xlsread('Datos.xls'); % Matriz inicial de datos
[f c]=size(M)

% 2. Quedarme con las filas de la columna 17 que estuviesen vacías
[fN17,c,vN17] = find(isnan(M(:,17)));

% 3. Eliminar las columnas a la derechas de 16
M(:,17:end)=[];

% 4. Quedarme con las filas de la columna 11 que tenga formato $PDLMi,
% siendo i=0,1,2 (Pasar antes por exel y reemplazar $PDLMA por '0'...
% *Ver 'strrep'en matalb) + ...
[fP0,c,vP0] = find(M(:,11)==0);
[fP1,c,vP1] = find(M(:,11)==1);
[fP2,c,vP2] = find(M(:,11)==2);
% ... + Quedarme con las filas que, teniendo vacía la columna 11, no
% tienen vacía la columna 4
for i=1:f
for j=1:c
if isnan(M(i,11))&&M(i,4)~=0
M(i,j)=M(i,j);
else
M(i,j)=[];
end
end
end

% 5. Introducir sólo en las filas que tienen el valor $PDLM0 ó '0' en la columna 11
% una columna vacía entre la columna 11 y la siguiente columna de datos (12)
for i=1:f
for j=1:c
if M(i,11)==0

¿?

else
M(i,j)=M(i,j);
end
end
end

% 6. Comprobar que los datos de diferentes columnas están entre los intervalos
% adecuados y eliminar las filas que contengan datos fuera de estos intervalos:
% columna 4 (-5,-5.2)
[fa4,c,va4] = find(M(:,4)<-5);
[fb4,c,vb4] = find(M(:,4)>(-5.2)); % Aquí tendría que introducir intervalos para otras columnas...


M1=zeros(size(M),f);
M1(:,11,:)=M(fP1,11,vP1)
% Ahora tengo que insertar en la matriz 'm' las filas completas que han cumplido
% las condiciones, para tener la matriz de datos limpia


[f1 c1]=size(M) % Para ver que se ha reducido el nº de filas y columnas

% 7. Ordenar por columna 2
[Mfin,I] = sort(m(:,2),1,ascend);
for j = 1:n
Mfin(:,j) = m(I(:,j),j);
end

% 8. OJO! Lo adecuado sería obtener:
% Ejemplo:
% LON LAT ALT $PDLMi(columna 11)
% -5.22 36.8 800.9
% 0
% 1
% 2
% 0
% 1
% 2
%
% LON LAT ALT $PDLMi
% -5.22 36.8 800.9
% 0
% 1
% 2
% 0
% 1
% 2
% 2 Pero obtenemos cosas parecidas a estas en algunas
% ocasiones.
% Habría que buscar la secuencia adecuada y calcular la media de la columna 13 (en las
% secuencias inadecuadas) para las repeticiones del $PDLMi (siendo i=0,1,2) en
% cada caso.


% GUARDAR
% save DatosOut.txt Definitivo -ASCII -TABS % En realidad debería guardarlo
% con comas en lugar de tabulaciones
% xlswrite('DatosOut',Definitivo)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar