Matlab:str2double适用于Windows PC,但不适用于Apple Mac



假设我有以下示例文件名: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"one_answers"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)) ;

您的问题与文档中提到的*nix(Linux和Mac)和Windows处理ls的不同方式有关。正如您所发现的,ls返回文件名的2D字符数组。在电脑上,这些文件名将每行返回一个。

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

最新更新