假设我有以下示例文件名:file_0250.pdf,file_0251.pdf,file_0252.pdf。我想获得以下单元格数组:
'250 251 252'.
在工作的Windows PC上,我可以运行以下代码而没有任何问题,但是在我家的Macbook上,我无法获得'str2double'值,因为它返回NaN值。令人沮丧的是:
folder_name = '/User/....';
file_name = 'file_';
extension = '.pdf';
%//' files pattern with absolute paths
filePattern = fullfile(folder_name, [file_name '*' extension] );
old_filename = cellstr(ls(filePattern)) ;
%// Get numbers associated with each file
file_ID = strrep(strrep(old_filename, file_name ,''), extension,'');
file_ID_doublearr = str2double(file_ID);
我尝试了'cell2mat','str2mat',但是它们与其余代码的搭配并不顺利:
file_ID_doublearr = file_ID_doublearr - min(file_ID_doublearr)+ start_number;
file_ID = strtrim(cellstr(num2str(file_ID_doublearr)));
%// Get zeros string to be pre-appended to each new_name
str_zeros = arrayfun(@(t) repmat('0',1,t), 4-cellfun(@numel,file_ID),'uni',0) ;
%// Generate new filenames
new_name = get(handles.new_name, 'string');
new_extension = get(handles.new_extension, 'string');
new_filename = strcat(new_name,str_zeros,file_ID,new_extension) ;
%// Finally rename files with the absolute paths
cellfun(@(m1,m2) movefile(m1,m2),fullfile(folder_name,file_name),fullfile(folder_name,new_filename)) ;
答案 0 :(得分:4)
您的问题与* nix(Linux和Mac)和Windows处理ls
as mentioned in the documentation的不同方式有关。正如您所知,ls
返回文件名的2D字符数组。在PC上,这些文件名将每行返回一次。
file_001.pdf
file_002.pdf
file_003.pdf
file_004.pdf
当您在结果上调用cellstr
时,它会将每个文件名放入其自己的单元格数组元素中,之后您可以成功提取数字部分并将其转换为数字。
在基于* nix的系统上,ls
通常会产生多列输出。例如:
file_001.pdf file_002.pdf file_003.pdf
file_004.pdf
当您在此处调用cellstr
时,每行将获得一个单元格数组元素 ,但正如您所看到的,第一行实际上包含三个文件名。然后,一旦你提取了数字部分,你会得到这样的东西:
'001 002 003'
'004'
当您尝试转换为某个数字时,您尝试将一串数字转换为单个数字,然后获得NaN
。
str2double({'001 002 003'; '004'})
% NaN 4
解决此问题的最佳方法是不使用依赖于操作系统的ls
并使用dir
来保证一致跨操作系统的行为。
files = dir(fullfile(folder_name, [filename, '*', extension]));
numbers = regexp({files.name}, '[0-9]*', 'match');
另一个选项是确保file_ID
不包含任何以空格分隔的数字。
file_IDs = {'001 002 003'; '004'};
% Break each element up into multiple elements if it contains spaces
file_IDs = cellfun(@(x)strsplit(x), file_IDs, 'UniformOutput', 0);
file_IDs = cat(2, file_IDs{:});
% Now convert to a number
str2double(file_IDs);
% 1 2 3 4