Fermi restando i dubbi sull'opportunità di usare MatLab per processare dei files di testo molto grossi, un possibile approccio potrebbe essere:
- leggere il file di input una riga alla volta (con la funzione "fgetl")
- usare la funzione "strtok" per identificare la lettera / le lettere che precedono il segno "="
- in base alla lettera individuata:
- nel caro sia "T"
- viene creato il nome del file di output in base alla data definita dopo il segno "=" (con la funzione "datevec")
- negli altri casi, scrivere direttamente la riga nel file di output
Per poter importare facilmente ii vari files di testo così generati, sembra utile:
- definire il file di output come un file MatLab (estensione ".m")
- scrivere in esso le varie righe in formato "array"
Questo consente di caricare il file nel Workspace semplicemente "lanciando" il file stesso.
Non avendo ricevuto risposa alle ultime domande relative al formato ed al contenuto del file di input, sulla base dell'esempio fornito,
se il contenuto / formato del file di input è il seguente
T=09/04/2015 10:08:49.000 9
U=3.31,4.81,12.38,23.75
PS=220,1422,STA1,0,2,0,1,120,120,0,0
C=34755
L=-9668
L=-9665
L=-9664
L=-9672
L=-9663
L=-9658
T=19/03/2015 10:08:49.000 9
U=3.31,4.81,12.38,23.75
PS=220,1422,STA1,0,2,0,1,120,120,0,0
C=12345
L=-43643
L=-7536
L=-5236
L=-8536
L=-3656
L=-3464
questo codice
% Apertura del file di input
fp_in=fopen('x.txt','rt')
% Lettura del file di input, riga per riga
while 1
tline = fgetl(fp_in);
% Se è stata raggiunta la fine del file di input
if ~ischar(tline)
% Stampa nel file di output della "]" che chiude il vettore dati "L"
fprintf(fp_out,'];\n')
% Si forza l'uscita dal loop di letura del file di input
break
end
% Scomposizione della i-esima riga in base al swgno "="
[token, remain]=strtok(tline,'=');
% A seconda di cosa precede il segno "=" ...
switch(token)
% "T" identifica una nuova sezione ==> un nuovo file di output
case 'T'
% Controllo per la chiusura del precedente file di output
if(exist('fp_out'))
% Stampa nel file di output della "]" che chiude il vettore
% dati "L"
fprintf(fp_out,'];\n')
% Chiusura del file di output
fclose(fp_out)
end
% Settaggio del flag usato per scrivere una volta sola "L=[" nel
% file di output
L_flg=1;
% Eliminazione del segno "=" dalla seconda parte della i-esima
% riga in input
remain(1)=[];
% Eliminazione del "9" al fondo della riga (ammessoche non serva)
remain(end)=[];
% Creazione del nome dello i-esimo file di output in base alla
% data
new_file=['file_' strrep(num2str(datevec(remain,'dd/mm/yyyy HH:MM:SS.FFF')),' ','_') '.m']
% Apertura del file di output
fp_out=fopen(new_file,'wt')
case 'U'
% Se la riga contiene "U=...", la riga viene scritta in forma di
% vettore nel file di output
fprintf(fp_out,'U=[%s];\n',remain(2:end))
case 'L'
% Se la riga contiene "L=...", la prima volta la viene scritto nel
% file di output "L=[" seguito dal numero
if(L_flg)
L_flg=0;
fprintf(fp_out,'L=[%f\n',str2num(remain(2:end)))
else
% Per le occorrenze successive, viene scritto solo il valore.
% La "]" viene chiusa al termine della lettura della i-esima
% sezione del file di input (vedi sopra)
fprintf(fp_out,'%f\n',str2num(remain(2:end)))
end
case 'C'
% Se la riga contiene "C=...", la riga viene scritta in forma di
% vettore nel file di output
fprintf(fp_out,'C=[%s];\n',remain(2:end))
case 'PS'
% Se la riga contiene "PS=...", la riga viene scritta tale e quale
% e "commentata". Bisogna definire come trattare la stringa "STA1"
c='%';
fprintf(fp_out,'%c %s\n',c,tline)
disp('PS')
otherwise
disp('unknown')
end
end
fclose(fp_in);
genera questi due files ".mat"
file_2015_____3____19____10_____8____49.m
U=[3.31,4.81,12.38,23.75];
% PS=220,1422,STA1,0,2,0,1,120,120,0,0
C=[12345];
L=[-43643.000000
-7536.000000
-5236.000000
-8536.000000
-3656.000000
-3464.000000
];
file_2015_____4_____9____10_____8____49.m
U=[3.31,4.81,12.38,23.75];
% PS=220,1422,STA1,0,2,0,1,120,120,0,0
C=[34755];
L=[-9668.000000
-9665.000000
-9664.000000
-9672.000000
-9663.000000
-9658.000000
];
Il codice è facilmente aggiornabile per trattare altre "lettere" che precedano il segno "=" (
DISCLAIMER: IL CODICE E' FORNITO "AS IS" ED E' STATO SVILUPPATO IN BASE AD IN FORMAZIONI INCOMPLETE SUL FORMATO / CONTENUTO DEL FILE DI INPUT - NON SO GARANTISCE LA SUA VALIDITA PER INOUT DIVERSI DA QUELLO SOPRA RIPORTATO COME ESEMPIO.
Un paio di consigli nel caso di modifiche al codice:
fai sempre una copia dei files di input prima di utilizzare il codice
nel definire gli handle dei files di input e outpout (le variabili ritornate dalle chiamate alle funzioni "fopen" USA SEMPRE VARIABILI CON NOMI MOLTO DIFFERENTI