Matlab:阅读可能有问题的.csv

时间:2016-05-18 14:16:19

标签: matlab csv

我正在编写GUI,我在其中加载包含测量数据的.csv个文件。该文件定义明确:

<variable>(<unit>),<variable>(<unit>),...
0.005,NaN,...

我正在VarsUnitsData处理它:

A=importdata('foo.csv',',');
Data=A.data;
[Vars,Units]=ProcessHeaderLine(A.colheaders);

当数据部分损坏时出现问题 - 单元格中有字符串而不是数字:

<variable>(<unit>),<variable>(<unit>),...
0.005,"- N/A -   ",...

在这种情况下,运行importdata函数需要很长时间并抛出错误:

  

Error using importdata (line 136)
  Unable to open file.

     

Error in <.m file> (line 384)
  A=importdata('foo.csv'],',');

这种方法是否比try-catch更快,能够处理标题和数据并且能够处理数据包含字符串&#34;单元格&#34;?

2 个答案:

答案 0 :(得分:1)

即使这是一个MATLAB问题,Perl也是预处理文件的最佳方式(Perl包含在MATLAB发行版中!)。以下命令行脚本将"- N/A -"替换为999999。选择您喜欢的任何替换值,并在运行importdata()后在MATLAB中处理它。

perl -pi -e 's/\"- N\/A -\"/999999/g' filename.csv

注意:这会就地更改文件!在尝试此操作之前,请务必制作文件的备份副本。

注意2:如果您确实需要,可以使用MATLAB system()调用从GUI运行此预处理步骤。

答案 1 :(得分:1)

虽然它更适合垂直布局而非水平放置的数据,但您可以使用可读函数。

% Use readtable to read the data as a table:
% The first row is the column names, the second row is the data
t = readtable('foo.csv', 'ReadVariableNames', false);

% Use {} brackets to extract from the table
colheaders = t{1,:};
Data = str2double(t{2,:});

在这种情况下,str2double将采用任何无效文本,例如“ - N / A - ”,并将其转换为NaN。