Problema eliminazione riga e salvataggio matrice

di il
1 risposte

Problema eliminazione riga e salvataggio matrice

Buongiorno, ho vari file .csv, che ho nominato con numeri progressivi, che contengono dati di tot righe e 6 colonne, così fatti:
latitudine;longitudine;altitudine;data;ora;timestamp
39.981272;116.309435;423.29437664042;2009-06-28;17:45:08;1246203908000
Io vorrei eliminare il primo rigo e salvare in nuovi file o anche in questi con tutte le cifre senza troncamenti, ma non riesco.
Ho scritto questo codice.
n=3;
b=[];
format longeng
for i=1:n
name=['file' num2str(i) '.csv'];

table = readtable(name,'Delimiter',';','ReadVariableNames',false); %ho cambiato , con ;
s=table2array(table (2:end,:));

b=[b;s];

end

ora però b è un 4800x6 cell
Devo trasformarla in una matrice di 4800 righe e 6 colonne e salvarla ma se uso
cell2mat(b)
mi dice:
Error using cat
Dimensions of matrices being concatenated are not consistent.

Error in cell2mat (line 83)
m{n} = cat(1,c{:,n});
Se invece dopo l'end uso
data = str2double(b);
la colonna 4 e 5 di data e ora mi spuntano come NaN ma la matrice mi viene convertita in 4800x 6 double.
Potreste aiutarmi?
Mi dava un warning %gia qui mi dava questo earning Warning: Unable to determine the format of the DATETIME data. %Try adding a format to the DATETIME specifier. e.g. '%{MM/dd/uuuu}D'. %> In table/readTextFile>textscanReadData (line 539) % In table/readTextFile (line 236) % In table.readFromFile (line 39) % In readtable (line 198) %(line 7 cioè con table2array)

Per salvarlo questo comando è corretto?
save 'provatraiettorieunite.txt' -ascii -double data

se invece vorrei salvare in double tutti i singoli files nel for, senza concatenare in b ma salvando le 3 matrici s, come dovrei scrivere?

1 Risposte

  • Re: Problema eliminazione riga e salvataggio matrice

    La cosa più semplice che puoi fare:
    [*] usare la funzione "dir" per ottenere l'elenco dei files; in alternativa puoi costruire i nomi dei files nel ciclo for, come hai fatto
    [*] creare un nuovo nome per il file "senza la prima riga, basato sul nome del file in input
    [*] leggere il file in input con la funzione "textscan" considerando ogni riga come una singola stringa di testo; questo eviterà, tra l'altro, che tu perda eventuali cifre decimali
    [*] scrivere, con un loop che scandisca le righe righe lette (tranne la prima) i dati nel nuovo file

    Una possibile implementazione potrebbe essere:
    
    % Individuaziione dei file di input
    file_list=dir('x*.csv')
    % Definizione del numro di righe da saltare
    n_header_rows=1
    % Loop sui fle di input
    for in_file=1:length(file_list)
       % Apertura i-esimo file di input
       % Creazione nome nuovo file
       [f_path,f_name,f_ext]=fileparts(file_list(in_file).name)
       new_f_name=[fullfile(f_path,[f_name '_new']) f_ext]
       % Apertura i-esimo file di input
       fp=fopen(file_list(in_file).name,'rt')
       % Lettura i-esimo file di input   
       C=textscan(fp,'%s')
       data=C{1}
       % Chusura i-esimo file di input
       fclose(fp)
       % Apertura i-esimo file di output
       fp=fopen(new_f_name,'wt')
       % Loop sulle righe da scrivere nel nuovo file
       for i=1+n_header_rows:length(data)
          % Scrittura dei dati neo nuovo file
          fprintf(fp,'%s\n',char(data{i}))
       end
       % Chiusura del nouvbo file di output
       fclose(fp)
    end
    
Devi accedere o registrarti per scrivere nel forum
1 risposte