Come analizzare il nome del file e rinominarlo in Matlab
Domanda
Sto leggendo un file .xls e poi procesing dentro e riscriverlo, alla fine del mio programma. Mi chiedevo se qualcuno mi può aiutare per analizzare le date come il mio nome file di input è come file_1_2010_03_03.csv
e voglio la mia outputfile sia
newfile_2010_03_03.xls
c'è un modo per inserire nel programma di MATLAB in modo che io non devo scrivere manualmente il comando
xlswrite ( 'newfile_2010_03_03.xls', M);
ogni volta e cambiare le date, come i file di input con le date diff
piace
file_2_2010_03_04.csv.
Forse non sono stato chiaro> Sto usando uigetfile all'ingresso 3 file in formato diff file_1_2010_03_03.csv, file_2_2010_03_03.csv, file_3_2010_03_03.csv
Ora sto elaborazione del file all'interno del mio programma e la scrittura di 4 file di output con i nomi newfileX_3_2010_03_03.xls, newfileXY_3_2010_03_03.xls, newfileXZ_3_2010_03_03.xls, newfileYZ_3_2010_03_03.xls
quindi non sono le mie date data corrente, ma ho bisogno che dal file di input e di aggiunta che in newname per il mio xlswrite.
quindi mi chiedevo se c'è un modo posso scrivere un generico
xlswrite ( 'xxx' M); che scegliere il nome che voglio invece di avere 2 modificare il nome 'xxx' ogni volta che un nuovo file di input
Grazie
Grazie
Soluzione
Sembra che ho frainteso quello che volevi dire con 'file_1', 'file_2' - ho pensato che i numeri 1 e 2 avevano un qualche tipo di importanza
.oldFileName = 'something_2010_03_03.csv';
%# extract the date (it's returned in a cell array
theDate = regexp(oldFileName,'(\d{4}_\d{2}_\d{2})','match');
newFileName = sprintf('newfile_%s.xls',theDate{1});
versione precedente con spiegazioni
Suppongo che la data in tutti i file è lo stesso. Così il vostro programma sarebbe andato
%# load the files, put the names into a cell array
fileNames = {'file_1_2010_03_03.csv','file_2_2010_03_03.csv','file_3_2010_03_03.csv'};
%# parse the file names for the number and the date
%# This expression looks for the n-digit number (1,2, or 3 in your case) and puts
%# it into the field 'number' in the output structure, and it looks for the date
%# and puts it into the field 'date' in the output structure
%# Specifically, \d finds digits, \d+ finds one or several digits, _\d+_
%# finds one or several digits that are preceded and followed by an underscore
%# _(?<number>\d+)_ finds one or several digits that are preceded and follewed
%# by an underscore and puts them (as a string) into the field 'number' in the
%# output structure. The date part is similar, except that regexp looks for
%# specific numbers of digits
tmp = regexp(fileNames,'_(?<number>\d+)_(?<date>\d{4}_\d{2}_\d{2})','names');
nameStruct = cat(1,tmp{:}); %# regexp returns a cell array. Catenate for ease of use
%# maybe you want to loop, or maybe not (it's not quite clear from the question), but
%# here's how you'd do with a loop. Anyway, since the information about the filenames
%# is conveniently stored in nameStruct, you can access it any way you want.
for iFile =1:nFiles
%# do some processing, get the matrix M
%# and create the output file name
outputFileX = sprintf('newfileX_%s_%s.xls',nameStruct(iFile).number,nameStruct(iFile).date);
%# and save
xlswrite(outputFileX,M)
end
espressioni regolari per più dettagli su come usarli. Inoltre, si può essere interessati a uipickfiles per sostituire uigetfile.
Altri suggerimenti
Non capisco se si vuole costruire il nome del file in base alla data o no. Se si vuole solo cambiare il nome del file si legge, si può fare questo:
filename = 'file_1_2010_03_03.csv';
newfilename = strrep(filename,'file_1_', 'newfile_');
xlswrite(newfilename,M)
UPDATE:
Per analizzare la data dal nome del file:
dtstr = strrep(filename,'file_1_','');
dtstr = strrep(dtstr,'.csv','');
DT = datenum(dtstr,'yyyy_mm_dd');
disp(datestr(DT))
Per costruire il nome del file in base alla data (ad esempio di oggi):
filename = ['file_', datestr(date,'yyyy_mm_dd') '.csv'];
Presumibilmente, tutti questi file sono seduti in una directory da qualche parte e ti piacerebbe elaborarli in batch. È possibile utilizzare il codice come questo per leggere i file in una particolare directory e trovare quelli che terminano in 'csv'. In questo modo, non c'è bisogno di modificare il codice a tutti se si desidera elaborare un nuovo file -. Basta cadere nella directory ed eseguire il programma
extension = 'csv';
files = dir(); % e.g. use current directory
% find files with the proper extension
extLength = length(extension);
for k = 1:length(files)
nameLength = length(files(k).name);
if nameLength > extLength
if (files(k).name((nameLength - extLength + 1):nameLength) == extension)
a(k).name
% process file here...
end
end
end
Si può rendere più compatto incorporando l'elaborazione regexp che Jonas ha suggerito.
Se i 3 file da UIGETFILE tutto hanno la stessa data in loro nome, allora si può solo utilizzare uno di loro per effettuare le seguenti operazioni (dopo aver elaborato tutti i dati dai 3 file):
fileName = 'file_1_2010_03_03.csv'; %# One of your 3 file names
data = textscan(fileName,'%s',... %# Split string at '_' and '.'
'Delimiter','_.');
fileString = sprintf('_%s_%s_%s.xls',.. %# Make the date part of the name
data{1}{(end-3):(end-1)});
xlswrite(['newfileX' fileString],dataX); %# Output "X" data
xlswrite(['newfileXY' fileString],dataXY); %# Output "XY" data
xlswrite(['newfileXZ' fileString],dataXZ); %# Output "XZ" data
xlswrite(['newfileYZ' fileString],dataYZ); %# Output "YZ" data
La funzione textSCAN viene utilizzato per rompere il vecchio nome del file nei punti in cui si verificano i personaggi '_'
o '.'
. La funzione sprintf viene quindi utilizzato per mettere i pezzi per la data di nuovo insieme.