Pregunta

Estoy leyendo un archivo de .xls y luego Procesamiento, por dentro y volver a escribir en el final de mi programa. Me preguntaba si alguien me puede ayudar a analizar las fechas como mi nombre de archivo de entrada es como file_1_2010_03_03.csv

y quiero que mi outputfile sea

newfile_2010_03_03.xls

¿Hay una manera de incorporar en el programa Matlab, así que no tengo que escribir manualmente el comando
xlswrite ( 'newfile_2010_03_03.xls', M); cada vez y cambiar las fechas como i archivos de entrada con fechas diff
me gusta file_2_2010_03_04.csv.

Tal vez yo no estaba claro>   Estoy usando uigetfile a la entrada 3 archivos en formato diff file_1_2010_03_03.csv, file_2_2010_03_03.csv, file_3_2010_03_03.csv

Ahora estoy procesando el archivo dentro de mi programa y escribir archivos de salida 4 con los nombres newfileX_3_2010_03_03.xls, newfileXY_3_2010_03_03.xls, newfileXZ_3_2010_03_03.xls, newfileYZ_3_2010_03_03.xls

así que las fechas no son fecha actual, pero necesito que desde el archivo de entrada y añadir que a nombre_nuevo para mi xlswrite.

así que se preguntaba si hay una manera que puede escribir un genérico

xlswrite ( 'xxx' M); que elegir el nombre que quiero en mi lugar que tiene 2 modificar el nombre de 'XXX' cada vez que un nuevo archivo de entrada

Gracias

Gracias

¿Fue útil?

Solución

Parece que no he entendido lo que quería decir con 'file_1', 'file_2' - pensé que los números 1 y 2 tenían algún tipo de importancia

.
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});

versión anterior con explicaciones

Asumo que la fecha en todos los archivos es el mismo. Por lo que su programa iría

%# 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

expresiones regulares para obtener más detalles sobre cómo utilizarlos. También, usted puede estar interesado en uipickfiles para reemplazar uigetfile.

Otros consejos

No entiendo si usted quiere construir el nombre de archivo basado en la fecha o no. Si lo que desea es cambiar el nombre del archivo que lee, usted puede hacer esto:

filename = 'file_1_2010_03_03.csv';
newfilename = strrep(filename,'file_1_', 'newfile_');
xlswrite(newfilename,M)

ACTUALIZACIÓN:

Para analizar la fecha a partir del nombre de archivo:

dtstr = strrep(filename,'file_1_','');
dtstr = strrep(dtstr,'.csv','');
DT = datenum(dtstr,'yyyy_mm_dd');
disp(datestr(DT))

Para crear el nombre de archivo basado en la fecha (de, por ejemplo, en la actualidad):

filename = ['file_', datestr(date,'yyyy_mm_dd') '.csv'];

Es de suponer que todos estos archivos están sentados en un directorio en algún lugar y desea procesarlos en lote. Puede utilizar el código de este tipo lea los archivos en un directorio en particular y encontrar los que terminan en 'csv'. De esta manera, usted no tiene que cambiar su código en absoluto si desea procesar un archivo nuevo -. Que acaba de caer en el directorio y ejecutar su programa

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

Puede que sea más compacta al incorporar el procesamiento de expresiones regulares que Jonas sugirió.

Si los 3 archivos de UIGETFILE todo tienen la misma fecha de su nombre, a continuación, puedes usar uno de ellos para hacer lo siguiente (después de haber procesado todos los datos desde los 3 archivos):

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 función TextScan se utiliza para romper el nombre del archivo de edad en los lugares donde ocurren las '_' o '.' caracteres. La función sprintf se utiliza para poner las piezas para la fecha de nuevo juntos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top