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

时间:2016-06-04 17:43:11

标签: matlab

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

1 个答案:

答案 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