Recuperar datos de un .txt en Scilab
Flo
-
janeo -
janeo -
Bonjour,
Estoy comenzando en Scilab y nunca he trabajado con Matlab (no tengo mucha ventaja)
Mi objetivo es procesar un archivo '.txt' en Scilab para extraer datos.
Típicamente, mi archivo está constituido por un encabezado de 83 líneas (que puedo omitir) y 4096 líneas de resultados de medidas, escritas en la siguiente forma:
Mi objetivo es recuperar la parte real en una tabla de 1 fila y 4096 columnas.
He redactado el siguiente programa en Scilab:
Y cuando lo ejecuto obtengo:
La función 'msscanf' me permite obtener la línea deseada en forma de cadena de caracteres, pero cuando trato de convertirla a números usando la función 'evstr' se vuelve un desorden.
¿Es esto debido a mis tipos de variables '%s'? (He probado con '%f' y es todavía peor). ¿O bien, proviene del tipo de conversión que estoy utilizando? Sé que en Matlab existe una función 'textscan' capaz de hacer lo que quiero, pero no conozco un equivalente en Scilab.
Actualmente estoy probando con la función 'read' y otra forma de proceder, pero no funciona y me devuelve los mismos valores.
Gracias por tu ayuda y detalla porque soy un novato en Scilab.
Atentamente.
Estoy comenzando en Scilab y nunca he trabajado con Matlab (no tengo mucha ventaja)
Mi objetivo es procesar un archivo '.txt' en Scilab para extraer datos.
Típicamente, mi archivo está constituido por un encabezado de 83 líneas (que puedo omitir) y 4096 líneas de resultados de medidas, escritas en la siguiente forma:
N° de la medida Tiempo Parte real Parte Imaginaria 1 -4,0000000000e-002 1,27177e-002 9,86312e-004
Mi objetivo es recuperar la parte real en una tabla de 1 fila y 4096 columnas.
He redactado el siguiente programa en Scilab:
// Apertura del archivo archivo_mes_lib=mopen('Nombre del archivo','r'); // Lectura de las líneas de la medida donnee_mesure_char_lib=mgetl(archivo_mes_lib,4096); // Cierre del archivo mclose(archivo_mes_lib); // Conversión de los datos de cadena de caracteres a valor numérico donnee_mesure_lib_char=msscanf(donnee_mesure_char_lib,'%s %s %s %s'); donnee_mesure_lib=evstr(donnee_mesure_lib_char); // Recuperación de los datos y formato donnee_mesure_libre=donnee_mesure_lib(:,3)'; Y cuando lo ejecuto obtengo:
donnee_mesure_lib_char = !1 -4,0000000000e-002 1,27177e-002 9,86312e-004 ! donnee_mesure_lib = 1. - 4. 0. 1. 271.77 9. 8.6312 donnee_mesure_libre = 0.
La función 'msscanf' me permite obtener la línea deseada en forma de cadena de caracteres, pero cuando trato de convertirla a números usando la función 'evstr' se vuelve un desorden.
¿Es esto debido a mis tipos de variables '%s'? (He probado con '%f' y es todavía peor). ¿O bien, proviene del tipo de conversión que estoy utilizando? Sé que en Matlab existe una función 'textscan' capaz de hacer lo que quiero, pero no conozco un equivalente en Scilab.
Actualmente estoy probando con la función 'read' y otra forma de proceder, pero no funciona y me devuelve los mismos valores.
Gracias por tu ayuda y detalla porque soy un novato en Scilab.
Atentamente.
Configuración: Windows XP Internet Explorer 6.0
1 respuesta
-
hola flo,
el problema viene de las comas, para scilab la coma separa dos entradas de una matriz en la misma línea. También tenemos el mismo efecto con un espacio, por ejemplo:
-->[1, 2, 3; 4 5 6]
ans =
1. 2. 3.
4. 5. 6.
el separador "decimal" es en realidad el punto, por lo que debes reemplazar las comas de tu archivo por puntos. Tienes dos soluciones, o lo haces con un editor antes de cargar tus datos en scilab, o lo haces después del mgetl utilizando la función strsubst:
-->M=['1 2,3 4,567e8 9e-10']//una línea con 4 entradas
M =
1 2,3 4,567e8 9e-10
-->B=strsubst(M,',','.')//cambiamos , por . en M
B =
1 2.3 4.567e8 9e-10
-->evstr(B)//interpretamos la cadena
ans =
1. 2.3 4.567D+08 9.000D-10
Philippe.-
Muchas gracias, Philippe. Mi problema realmente venía de las comas. Me di cuenta después al comparar con las búsquedas de un colega. Así que me aseguré de que el software que me genera mi archivo '.txt' pusiera puntos en lugar de comas y ahora funciona bien. ¡Pero no dudo que tu método también funciona!
Gracias de nuevo
Hasta pronto
-