Как разобрать имя файла и переименовать в Matlab - PullRequest
1 голос
/ 16 марта 2010

Я читаю файл .xls, а затем обрабатываю его внутри и переписываю в конце моей программы. Мне было интересно, если кто-то может помочь мне разобрать даты поскольку мое имя входного файла похоже на file_1_2010_03_03.csv

и я хочу, чтобы мой выходной файл был

newfile_2010_03_03.xls

есть ли способ включить в программу Matlab, поэтому мне не нужно вручную писать команду
xlswrite ('newfile_2010_03_03.xls', M); каждый раз и меняйте даты, когда я ввожу файлы с разными датами
лайк file_2_2010_03_04.csv.

Может быть, я не был ясен> Я использую uigetfile для ввода 3 различных файлов в формате file_1_2010_03_03.csv, file_2_2010_03_03.csv, file_3_2010_03_03.csv

Теперь я обрабатываю файл внутри моей программы и пишу 4 выходных файла. с именами newfileX_3_2010_03_03.xls, newfileXY_3_2010_03_03.xls, newfileXZ_3_2010_03_03.xls, newfileYZ_3_2010_03_03.xls

так что мои даты не являются текущей датой, но мне нужно это из входного файла и добавить это к новому имени для моего xlswrite.

так было интересно, есть ли способ, которым я могу написать общий

xlswrite ('xxx' M); который выберет имя, которое я хочу вместо меня, имея 2, изменяйте имя «xxx» каждый раз, когда я вводю новый файл

Спасибо

Спасибо

Ответы [ 4 ]

1 голос
/ 16 марта 2010

Похоже, я неправильно понял, что вы имели в виду под 'file_1', 'file_2' - я думал, что числа 1 и 2 имеют какое-то значение.

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

Старая версия с пояснениями

Я предполагаю, что дата во всех ваших файлах одинакова. Таким образом, ваша программа будет идти

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

См. регулярные выражения для более подробной информации о том, как их использовать. Кроме того, вы можете быть заинтересованы в uipickfiles для замены uigetfile.

0 голосов
/ 16 марта 2010

Предположительно, все эти файлы находятся где-то в каталоге, и вы хотите обработать их в пакетном режиме. Вы можете использовать подобный код для чтения файлов в определенном каталоге и найти те, которые заканчиваются на «csv». Таким образом, вам совсем не нужно менять код, если вы хотите обработать новый файл - вы просто перетаскиваете его в каталог и запускаете программу.

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

Вы можете сделать его более компактным, включив обработку регулярного выражения, предложенную Джонасом.

0 голосов
/ 16 марта 2010

Если ваши 3 файла из UIGETFILE имеют одинаковую дату в названии, то вы можете просто использовать один из них для выполнения следующих действий (после обработки всех ваших данных из 3 файлов):

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

Функция TEXTSCAN используется для разбиения старого имени файла в точках, где встречаются символы '_' или '.'. Функция SPRINTF затем используется для того, чтобы соединить части даты вместе.

0 голосов
/ 16 марта 2010

Я не понимаю, хотите ли вы построить имя файла на основе даты или нет. Если вы просто хотите изменить имя прочитанного файла, вы можете сделать это:

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

UPDATE:

Для разбора даты по имени файла:

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

Чтобы построить имя файла на основе даты (например, сегодня):

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