【问题标题】:Matlab: reading possibly faulty .csvMatlab:读取可能有错误的.c​​sv
【发布时间】:2016-09-15 02:22:54
【问题描述】:

我正在编写 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 &lt;.m file&gt; (line 384)
A=importdata('foo.csv'],',');

有没有比try-catch这种方法更快的方法,能够同时处理标题和数据,并能够处理包含字符串“单元格”的数据?

【问题讨论】:

  • MATLAB 非常适合处理纯数字数据文件。字符串数据不是很好,而且没有一个 MATLAB 阅读器可以很好地处理可以将类型从一条记录更改为另一条记录的数据。您的示例特别令人不安,因为它显示了不平衡的引号!如果您的“字符串”数据几乎总是相同的,并且它是真实数据不可用的标记,那么最好的解决方案是预处理数据文件。将字符串(在本例中为" N/A)替换为对您的应用程序无效的数值(可能是-1?可能是999999?)。
  • @gariepy 字符串实际上是"- N/A - ",我可以识别问题并且可以半自动修复它。但我是这里(实验室里)唯一一个疯狂到能够追踪并面对它的人。结果本来就是万无一失的密封黑匣子……
  • 其中一个测试文件 - 有问题的文件 - 包含整列中的字符串。问题是我不知道 为什么N/A 标志。关于函数设计我不知道在第二行寻找字符串是否足以决定如何处理文件。
  • 因此,如果您知道在某些条件下可以获取字符串 "- N/A - ",那么预处理数据文件以将其删除会增加系统的稳健性,尤其是在您无法修复所有它发生的情况。在运行多步模拟时,我不得不多次这样做,其中一个 sim 的输出与另一个 sim 所需的输入不完全匹配。添加预处理步骤非常简单,如果需要,您可以继续工作,并在以后修复N/A 问题。

标签: matlab csv


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    虽然它更适合垂直布局而不是像您那样水平布局的数据,但您可以使用 readtable 函数。

    % 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。

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2016-12-26
      相关资源
      最近更新 更多