Matlab - Lectura de archivo txt con texto entre líneas

 
Vista:
sin imagen de perfil

Lectura de archivo txt con texto entre líneas

Publicado por Miguel Angel (7 intervenciones) el 19/01/2018 18:17:00
Que tal, como muchos, también tengo dificultades con matlab, mismo que es relacionado con la carga de datos puesto que mi archivo es un tanto complicado. Mi archivo tiene filas de datos y filas de letras repitiéndose sucesivamente. Es un archivo extremadamente largo y no se como hacerle para que omita los caracteres de letras...

Alguien podría ayudarme? les dejo una parte del archivo para que vean como es, ya que lo he intentado abrir con load y fopen pero no puedo cargarlos....

Agradezco su orientación...

Message for Platform unknownSite
| WD | WDK | WS | WSK | TEMP | RH | BP | RAIN | BATT | PANEL |
| UD | UR | US | UP | TA | XR | PA | PC | VB | SV |
UTC | Grados | Grados | kM | kM | Grados C | % | Mb | mM | V | V |
01/01/2017 22:00:00 | 323.000 | 270.000 | 5.40000 | 11.4000 | 31.9000 | 58.0000 | 1003.60 | 0 | 13.8000 | 0 |
01/01/2017 22:15:00 | 299.000 | 299.000 | 5.50000 | 10.8000 | 32.2000 | 53.0000 | 1003.50 | 0 | | |
01/01/2017 22:30:00 | 309.000 | 251.000 | 6.00000 | 10.8000 | 32.1000 | 52.0000 | 1003.70 | 0 | | |
01/01/2017 22:45:00 | 295.000 | 301.000 | 5.00000 | 12.0000 | 31.3000 | 54.0000 | 1003.70 | 0 | | |

Message for Platform HUA
| WD | WDK | WS | WSK | TEMP | RH | BP | RAIN | BATT | PANEL |
| UD | UR | US | UP | TA | XR | PA | PC | VB | SV |
UTC | Grados | Grados | kM | kM | Grados C | % | Mb | mM | V | V |
01/01/2017 22:00:00 | 323.000 | 270.000 | 5.40000 | 11.4000 | 31.9000 | 58.0000 | 1003.60 | 0 | 13.8000 | 0 |
01/01/2017 22:15:00 | 299.000 | 299.000 | 5.50000 | 10.8000 | 32.2000 | 53.0000 | 1003.50 | 0 | | |
01/01/2017 22:30:00 | 309.000 | 251.000 | 6.00000 | 10.8000 | 32.1000 | 52.0000 | 1003.70 | 0 | | |
01/01/2017 22:45:00 | 295.000 | 301.000 | 5.00000 | 12.0000 | 31.3000 | 54.0000 | 1003.70 | 0 | | |

Message for Platform HUA
| WD | WDK | WS | WSK | TEMP | RH | BP | RAIN | BATT | PANEL |
| UD | UR | US | UP | TA | XR | PA | PC | VB | SV |
UTC | Grados | Grados | kM | kM | Grados C | % | Mb | mM | V | V |
01/01/2017 22:00:00 | 323.000 | 270.000 | 5.40000 | 11.4000 | 31.9000 | 58.0000 | 1003.60 | 0 | 13.8000 | 0 |
01/01/2017 22:15:00 | 299.000 | 299.000 | 5.50000 | 10.8000 | 32.2000 | 53.0000 | 1003.50 | 0 | | |
01/01/2017 22:30:00 | 309.000 | 251.000 | 6.00000 | 10.8000 | 32.1000 | 52.0000 | 1003.70 | 0 | | |
01/01/2017 22:45:00 | 295.000 | 301.000 | 5.00000 | 12.0000 | 31.3000 | 54.0000 | 1003.70 | 0 | | |

Message for Platform unknownSite
| WD | WDK | WS | WSK | TEMP | RH | BP | RAIN | BATT | PANEL |
| UD | UR | US | UP | TA | XR | PA | PC | VB | SV |
UTC | Grados | Grados | kM | kM | Grados C | % | Mb | mM | V | V |
01/01/2017 22:00:00 | 323.000 | 270.000 | 5.40000 | 11.4000 | 31.9000 | 58.0000 | 1003.60 | 0 | 13.8000 | 0 |
01/01/2017 22:15:00 | 299.000 | 299.000 | 5.50000 | 10.8000 | 32.2000 | 53.0000 | 1003.50 | 0 | | |
01/01/2017 22:30:00 | 309.000 | 251.000 | 6.00000 | 10.8000 | 32.1000 | 52.0000 | 1003.70 | 0 | | |
01/01/2017 22:45:00 | 295.000 | 301.000 | 5.00000 | 12.0000 | 31.3000 | 54.0000 | 1003.70 | 0 | | |

Message for Platform HUA
| WD | WDK | WS | WSK | TEMP | RH | BP | RAIN | BATT | PANEL |
| UD | UR | US | UP | TA | XR | PA | PC | VB | SV |
UTC | Grados | Grados | kM | kM | Grados C | % | Mb | mM | V | V |
01/01/2017 22:00:00 | 323.000 | 270.000 | 5.40000 | 11.4000 | 31.9000 | 58.0000 | 1003.60 | 0 | 13.8000 | 0 |
01/01/2017 22:15:00 | 299.000 | 299.000 | 5.50000 | 10.8000 | 32.2000 | 53.0000 | 1003.50 | 0 | | |
01/01/2017 22:30:00 | 309.000 | 251.000 | 6.00000 | 10.8000 | 32.1000 | 52.0000 | 1003.70 | 0 | | |
01/01/2017 22:45:00 | 295.000 | 301.000 | 5.00000 | 12.0000 | 31.3000 | 54.0000 | 1003.70 | 0 | | |

Message for Platform HUA
| WD | WDK | WS | WSK | TEMP | RH | BP | RAIN | BATT | PANEL |
| UD | UR | US | UP | TA | XR | PA | PC | VB | SV |
UTC | Grados | Grados | kM | kM | Grados C | % | Mb | mM | V | V |
01/01/2017 22:00:00 | 323.000 | 270.000 | 5.40000 | 11.4000 | 31.9000 | 58.0000 | 1003.60 | 0 | 13.8000 | 0 |
01/01/2017 22:15:00 | 299.000 | 299.000 | 5.50000 | 10.8000 | 32.2000 | 53.0000 | 1003.50 | 0 | | |
01/01/2017 22:30:00 | 309.000 | 251.000 | 6.00000 | 10.8000 | 32.1000 | 52.0000 | 1003.70 | 0 | | |
01/01/2017 22:45:00 | 295.000 | 301.000 | 5.00000 | 12.0000 | 31.3000 | 54.0000 | 1003.70 | 0 | | |

Message for Platform HUA
| WD | WDK | WS | WSK | TEMP | RH | BP | RAIN | BATT | PANEL |
| UD | UR | US | UP | TA | XR | PA | PC | VB | SV |
UTC | Grados | Grados | kM | kM | Grados C | % | Mb | mM | V | V |
01/01/2017 23:00:00 | 281.000 | 300.000 | 5.70000 | 14.9000 | 30.9000 | 52.0000 | 1003.70 | 0 | 13.2000 | 0 |
01/01/2017 23:15:00 | 290.000 | 302.000 | 5.80000 | 9.7000 | 30.7000 | 53.0000 | 1003.80 | 0 | | |
01/01/2017 23:30:00 | 286.000 | 260.000 | 5.80000 | 10.8000 | 30.4000 | 55.0000 | 1003.90 | 0 | | |
01/01/2017 23:45:00 | 280.000 | 265.000 | 3.20000 | 9.7000 | 29.9000 | 59.0000 | 1004.10 | 0 | | |
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 Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Lectura de archivo txt con texto entre líneas

Publicado por Daniel (264 intervenciones) el 19/01/2018 21:37:57
Primero, para probar el código, copié los datos en un archivo test_1.txt.
Te indico como lo pensé...una solución mas o menos sencilla es la siguiente:
las lineas a leer tienen dos posibles formatos : 16 números (entre enteros y flotantes) o 14 números (faltan los dos últimos)
los formatos son fijos:

el de 16 numeros:
1
'%d/%d/%d %d:%d:%d | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | '

el de 14 numeros:
1
'%d/%d/%d %d:%d:%d | %f | %f | %f | %f | %f | %f | %f | %f | | | '


Cada %d simboliza un enteros y cada %f un flotante, lo demás son los separadores y espacios tal cual aparecen en el archivo

Básicamente el código hace lo siguiente:
- agarra cada linea con fgetl
- intenta (por eso el try) leer 16 números esto da 2 alternativas:
-- si puede leerlos los guarda en una fila de la tabla
-- si no puede leerlos va al segundo try
- el segundo try intenta leer 14 números esto da otra vez 2 alternativas:
-- si puede leerlos los guarda en una fila de la tabla (como la tabla tiene 16 columnas y lei 14 valores pongo NaN en los lugares que faltan)
-- si no puede leerlos entonces la linea no tiene ninguno de los dos formatos de números considerados válidos.
- vuelve al bucle y ahora con la siguiente linea repite todo de nuevo.

Te dejo el código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
clc
clear
fid=fopen('test_1.txt');
 
tabla=[];
while feof(fid)==0
    a=fgetl(fid);
    try % intenta leer una linea con 16 valores numericos
        s=sscanf(a,'%d/%d/%d %d:%d:%d | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | ')';
        tabla=[tabla;s]; % si lo logra, lo guarda en la tabla
    catch me % si no lo logra
        try % intenta leer una linea con 14 valores numericos
            s2=[sscanf(a,'%d/%d/%d %d:%d:%d | %f | %f | %f | %f | %f | %f | %f | %f | | | ')' NaN NaN];
            tabla=[tabla;s2];% si lo logra, lo guarda en la tabla (agrega NaN a los dos luegares Vacios)
        catch me
        end
    end
end
fclose(fid)

Comentanos como te fue

Saludos

Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Lectura de archivo txt con texto entre líneas

Publicado por Miguel Angel (7 intervenciones) el 22/01/2018 16:30:04
Que tal Daniel!

Me has sacado de un gran apuro, te agradezco mucho la ayuda, las líneas funcionan de maravilla.

Nuevamente agradezco el aporte...

Saludos!!
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