2016-06-04 6 views
0

Angenommen, ich habe die folgenden Beispieldateinamen: file_0250.pdf, file_0251.pdf, file_0252.pdf. Ich möchte folgende Zellenfeld erhalten:Matlab: str2double funktioniert auf Windows PC aber nicht auf Apple Mac

'250 251 252'. 

auf dem Windows-PC bei der Arbeit ich den folgenden Code ohne Probleme laufen können, aber auf meinem MacBook zu Hause kann ich nicht die ‚str2double‘ Werte, wie es bekommen gibt einen NaN-Wert zurück. Es ist frustrierend:

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

I ‚cell2mat‘, ‚str2mat‘ versucht, aber sie gehen nicht gut mit dem Rest des Codes:

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

Antwort

4

Ihr Problem mit der unterschiedlichen Art und Weise zu tun, dass * nix (Linux und Mac) und Windows behandeln lsas mentioned in the documentation. Wie Sie herausgefunden haben, gibt ls ein 2D-Zeichen-Array von Dateinamen zurück. Auf dem PC werden diese Dateinamen einmal pro Zeile zurückgegeben.

file_001.pdf 
file_002.pdf 
file_003.pdf 
file_004.pdf 

Wenn Sie cellstr auf das Ergebnis nennen, wird es jeden Dateinamen in seiner eigenen Zelle Array-Element platzieren, nach dem Sie erfolgreich die Anzahl Teil extrahieren und sie in Zahlen konvertieren.

Auf * nix-basierten Systemen liefert ls normalerweise einen mehrspaltigen Ausgang. Zum Beispiel:

file_001.pdf file_002.pdf file_003.pdf 
file_004.pdf  

Wenn Sie cellstr dazu aufrufen, werden Sie eine Zelle Array-Element pro Zeile, erhalten aber wie Sie die erste Zeile sehen kann, enthält tatsächlich drei Dateinamen. Dann, wenn Sie die Anzahl Teil extrahieren würden Sie so etwas wie dieses:

'001 002 003' 
'004' 

Wenn Sie versuchen, eine Zahl zu konvertieren, Sie versuchen, eine Reihe von Zahlen auf eine einzige Zahl zu konvertieren und Sie erhalten eine NaN.

str2double({'001 002 003'; '004'}) 
% NaN 4 

Die beste Weg, dies zu beheben, ist zu nicht die OS-abhängige ls verwenden und dir statt, die garantiert ein konsistentes Verhalten für alle Betriebssysteme haben.

files = dir(fullfile(folder_name, [filename, '*', extension])); 
numbers = regexp({files.name}, '[0-9]*', 'match'); 

Die andere Option ist, um sicherzustellen, dass file_ID keine Leerzeichen getrennte Zahlen enthält.

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 
+0

@Mosawi Das Problem ist * nicht * mit 'str2double' ist es mit' ls' zu verwenden. Ich habe meiner Antwort mehr Erklärung gegeben. – Suever

Verwandte Themen