2012-09-20 41 views
3

我想從示波器導入數據文件到Matlab。看起來示波器製造商試圖儘可能地使這項任務變得困難。這裏是文件的樣子:它有三列,最後兩列的值是可能有一個字母作爲單位後綴的數字(例如「m」= milli,「u」= micro,「n」 = nano ...),但並非總是如您在示例中所見。閱讀csv文件與改變字段在Matlab

現在我做類似

data = textscan(fid,'%d%s%s',ns,'Headerlines',1,'Delimiter',','); 

其中數據{1}是一個單元陣列,我可以很容易地轉換到一個載體中,但數據{2}和數據{3}是單元陣列的字符串。如果它是一個字母,我想去掉最後一個字符,轉換爲矢量,並根據單位後綴縮放每個元素(如果有的話)。

這裏是我的文件的摘錄:

No.,Time,CH1 
1,-6,0 
2,-5.99999,6m 
3,-5.99998,0 
4,-5.99997,8m 
5,-5.99996,-12m 
6,-5.99995,6m 
... 
600006,50u,-4m 
600007,60u,-8m 
600008,70u,62m 
600009,80u,0 
600010,90u,70m 
600011,100u,-104m 
+0

+1對於史詩線:「看起來範圍製造商試圖使這項任務儘可能困難」:) –

回答

1

對於最後一列,如果值始終爲0或與m終止,您可以使用正則表達式來剝去焦。

value = regexprep(input_string, 'm', ''); % replace any m's with nothing 

您可以在匿名函數把這個包,並將其與cellfun

convertFn = @(x) str2double(regexprep(x, 'm', '')); 
data_column = cellfun(convertFn, data{3}); 

適用於整個單元陣列如果終止符可以是一些其他的價值,您需要申請的解決方案下面的第二列。

轉換第二列有點複雜,因爲您想根據終止字符更改值。

您需要編寫一個簡單的函數來刪除char並返回縮放值。

function v = convert_str(s) 
    if numel(str)==1 && strcmp(s, '0') 
    v = 0; 
    else 
    v = str2double(s(1:end-1)); % convert all but last char to number 

    if strcmp(s(end), 'u')) 
     v = v * 1e-6; 
    end 
    end 
end 

然後,您可以使用這個新功能調用cellfun到第二列轉換:

data_column = cellfun(@convert_str, data{2}); 

注:上面的代碼沒有進行測試,但它說明你需要什麼做。

+0

非常感謝!我不得不針對我的具體情況稍微調整一下,但效果很好。我從來沒有意識到你可以使用cellfun自定義函數,但現在我知道了! –