使用Matlab读取包含变化字段的CSV文件

3
我将尝试将示波器中的数据文件导入Matlab。看起来制造商试图使此任务尽可能困难。文件如下:有三列,最后两列中的值是数字,可能有字母作为单位后缀(例如“m”=毫,“u”=微,“n”=纳...),但不总是这样,就像您在示例中看到的那样。
现在我正在执行以下操作:
data = textscan(fid,'%d%s%s',ns,'Headerlines',1,'Delimiter',',');

其中,data{1}是一个单元格数组,我可以轻松地将其转换为向量,但data{2}和data{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

对于这句话的“厂商似乎试图将这个任务变得尽可能困难”,我给它点赞 :) - Andrey Rubshtein
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}); 

如果终止字符可以是其他值,则需要应用下面第二列的解决方案。
转换第二列要复杂一些,因为您想要根据终止字符来改变值。
您需要编写一个简单的函数来剥离字符并返回缩放后的值。
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});

注意:上面的代码尚未经过测试,但它说明了你需要做什么。


非常感谢!我必须针对我的具体情况进行一些调整,但它很好用。我从未意识到您可以在cellfun中使用自定义函数,但现在我知道了! - SeismicVibrations

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接