Lettura e scrittura file .txt

di il
2 risposte

Lettura e scrittura file .txt

Salve a tutti,

ho un file di testo contenente sia dati numerici che caratteri, vorrei leggerlo e scriverne un altro estrapolando solo i dati numerici dal primo.

la struttura del file da leggere è la seguente:
le prime 4 righe sono di intestazione, composte da caratteri. il resto del file è suddiviso in colonne
la quinta riga contiene i titoli dei dati di ogni colonna sottostante ancora composta da caratteri
poi ci sono i dati: le prime due colonne sono caratteri il resto sono dati numerici.

incollo un'esempio del testo per cercare di essere più chiaro:
******
Experiment: exp1 
User: 
Library dependency list: 
Programme 
LABEL	STATUS	ERROR	TIME	CC_1.Combustor.MR(-)	CC_1.Combustor.P[1](Pa)	CC_1.Combustor.Ptot(Pa)	CC_1.Combustor.T[1](K)	
"transient-1"	INTEG_BEGIN	0	0	3.9	3000000	3000000	3500	
"transient-1"	IS_EVENT	0	1.00000247e-010	3.9	3000000	3000000	3500	
"transient-1"	IS_EVENT	0	1.00000247e-010	3.9	3000000	3000000	3500	
*******
vorrei leggere questo file utilizzando Matlab e produrne un altro che contenga solo le colonne di dati nello stesso ordine del primo.

grazie mille in anticipo per l'aiuto!



P.S.
Ho trovato una soluzione molto rozza che mi costringe a cancellare manualmente le prime righe dei file (ne ho molti di questa tipologia da processare) e di cambiare diverse impostazioni a seconda del numero di colonne che lo compongono. Allego il codice
close all
clear all
clc

report = fopen("prestazioni.rpt",'r');
rpt = textscan(report,'%s %s %f %f %f %f %f %f %f %f %f %f');  %cambiare manualmente numre %f in base alle colonne di dati

n = 12;    % aggiornare manualmente in base numero colonne di dati
i = 1;

    for j = 1:(n-3)     %numero colonne file finale
        k = 3+j;	  %scarto le prime tre colonne del file input
        B(:,j) = rpt{k};
    end
    C = B';
out = fopen("prestazioni.dat",'w');
fprintf(out,"%f %f %f %f %f %f %f %f %f\r\n",C);     %stesse indicazioni di textscan
fclose(out);
fclose(report);
ringrazio ancora anticipatamente chiunque abbia consigli e suggerimenti

2 Risposte

  • Re: Lettura e scrittura file .txt

    Un approccio semplice che consenta di leggere il file indipendentemente dal numero di colonne dati potrebbe essere:
    [*] leggere la prima riga dati del file con la funzione "textread
    [*] valutare il numero di "item" letti usando la funzione "strsplit" dividendo la stringa agli "spazi bianchi": il numero di colonne sarà il numero di elementi ritornato da "strsplit" meno due (le die stringhe che precedono i dati numerici)
    [*] leggere l'intero file di input con la funzione "textscan" specificando il numero di righe da saltare (5) e costruendo in modo dinamico il "format" in base al numero di colonne individuato nei passi precedenti
    [*] trasformare i dati letti da cellarray in matrice con la funzione cell2mat"

    Una possibile implementazione potrebbe essere
    
    % Lettura della prima riga di dati del file di input per stabilire il numero di
    % colonne
    C=textread('x.txt','%s',1,'delimiter','\n','headerlines',5)
    tmp=strsplit(char(C),' ')
    n_col=length(tmp)-2
    % Lettura del file di input completo con creazione del formato in base al numero
    % di colonne individuato al passo precedente
    fp=fopen('x.txt','rt')
    C=textscan(fp,['%s%s' repmat('%f',1,n_col)],'headerlines',5)
    fclose(fp)
    % Trasformazione del cellarray in matrice
    c=cell2mat(C(1,3:end))
    
    Nel caso si debbano leggere più files, si può inserire il tutto in u ciclo "for".
  • Re: Lettura e scrittura file .txt

    Grazie mille, soluzione semplice e funzionale. Mi hai semplificato molto la vita!

    non conoscevo la funzione "strsplit" mi tornerà utile!

    nella forma in cui me l'hai proposta
    tmp=strsplit(char(C),' ')
    generava una sola cella contenente tutto il testo letto quindi la "lunghezza dei dati" risultava = 1 è bastato non specificare il delimiter per eliminare il problema.

    i file di input che sto leggendo sono un po' antipatici (per non dire altro): anche alla fine dell'ultima colonna c'è uno spazio quindi
    tmp=strsplit(char(C))
    ha un ultima colonna vuota che comunque è stato semplice eliminare.

    ti ringrazio ancora per l'aiuto, sei stato gentilissimo!
Devi accedere o registrarti per scrivere nel forum
2 risposte