2014-10-16 70 views
0

我想寫一個強大的讀命令我的應用程序。我希望讀取的代碼能夠處理* .txt是否具有標題(標題)行。Matlab的ischar不能識別號碼

用戶將創建一個軌跡文件,它是寬總是7列和一個未知的長度。第一行可以是列的標題行或不是。通常我在Excel中創建我的文件,然後使用「Unicode文本」格式保存它們。我知道我可以使用xlsread(),但我更願意從文本文件中讀取多功能性。這是我的當前代碼:

In_fID=fopen([Dir,File],'r'); 
FirstLine=fgetl(In_fID); 
model_data=textscan(In_fID,'%f %f %f %f %f %f %f'); 
if ischar(FirstLine) 
    model_data=cell2mat(model_data); 
else 
    FirstLine=cell2mat(FirstLine); 
    model_data=cel2mat(model_data); 
    model_data=[FirstLine;model_data]; 
end 

不管第一行是否爲標題行等「時間xyzrp YW」或我的軌跡的第一座標(例如:「0 0 0 0 0 0 0」)ischar(Firstline)總是返回true(1)。有誰知道我該如何解決這個問題?

+0

'ischar'檢查*數據類型*,而不是*內容*。 – 2014-10-16 13:13:53

回答

0

ischar是不是你正在嘗試做檢查的最佳選擇。

您可以在第一個值做了檢查:

In_fID = fopen([Dir,File] , 'r') ; 

FirstValue = fscanf(In_fID,'%f',1) ; %// this will return empty if the first text does not represent a number 
if isempty(FirstValue) 
    Headers = textscan(In_fID , '%s %s %s %s %s %s %s' , 1) ; %// read the header titles 
else 
    fseek(In_fID , 0 , 'bof') ; %// Rewind the cursor to the beginning of the file 
end 
model_data=textscan(In_fID,'%f %f %f %f %f %f %f'); %// read your data normally 
fclose(In_fID) ; %// don't forget to close your file ;) 

這將嘗試從文件中讀取數值。
如果失敗(例如,如果在文件中的第一個文本不能被轉換到一數),則讀取一行文本標題標題的(並且將光標移動到下一行)。
如果一讀返回的實際值,程序退(取代光標停留在文件的開頭)。
最後一行將文件的其餘部分作爲數值讀取。

+0

好方法!我選擇了你的答案,因爲它更正式,對於下一個人來說「足夠基本」。我沒有意識到,如果格式不匹配,fscanf將返回空。謝謝! – 2014-10-17 01:38:11

2

只要您未達到EOF,fgetl的結果爲char是正常結果。在MATLAB命令窗口輸入doc fgetl尋求幫助;你會看到返回值是一個文本字符串或-1。

現在的問題是問的方式不是100%清楚什麼是預期的行爲......但我的猜測是:你想知道,如果掃描的第一行是一個標題或沒有。一個好的測試是檢查由sscanf(FirstLine, '%f')返回的轉換數字字段的數量;如果小於每行預計計,是一個很大的機會,是一個頭(它可能也是一個畸形線):

N_FIELDS_PER_LINE = 7; 
%// . . . 
if numel(sscanf(FirstLine, '%f')) ~= N_FIELDS_PER_LINE 
      %// Line-Is-Header case 
else 
      %// Line-Is-Data case 
end; 
+0

感謝您對fgetl的信息。那應該是我去過的第一位。 – 2014-10-17 01:39:13