在MATLAB中导入CSV文件的最快方法

Dor*_*oom 7 csv file-io matlab data-import

我编写了一个脚本,将其输出保存为CSV文件供以后参考,但导入数据的第二个脚本需要花费大量时间才能读回来.

数据采用以下格式:

Item1,val1,val2,val3
Item2,val4,val5,val6,val7
Item3,val8,val9
Run Code Online (Sandbox Code Playgroud)

标题位于最左侧列的位置,数据值占用行的其余部分.一个主要困难是数据值的数组对于每个测试项可以是不同的长度.我将它保存为结构,但我需要能够在MATLAB环境之外编辑它,因为有时我必须在没有安装MATLAB的计算机上删除坏数据行.所以,我的问题的第一部分是:我应该以不同的格式保存数据吗?

问题的第二部分:我尝试过importdata,csvreaddlmread,但我不确定哪个最好,或者是否有更好的解决方案.现在我正在使用我自己的脚本使用循环和fgetl,这对于大文件来说非常慢.有什么建议?

function [data,headers]=csvreader(filename); %V1_1
 fid=fopen(filename,'r');
 data={};
 headers={};
 count=1;
 while 1
      textline=fgetl(fid);
      if ~ischar(textline),   break,   end
      nextchar=textline(1);
      idx=1;
      while nextchar~=','
        headers{count}(idx)=textline(1);
        idx=idx+1;
        textline(1)=[];
        nextchar=textline(1);
      end
      textline(1)=[];
      data{count}=str2num(textline);
      count=count+1;
 end
 fclose(fid);
Run Code Online (Sandbox Code Playgroud)

(我知道这可能是非常复杂的代码 - 我是工程师,而不是程序员,请不要对我大喊大叫 - 但欢迎任何改进建议.)

gno*_*ice 10

如果您可以NaN在第一个脚本创建时使用值填充文件,则可能会使数据更易于读取:

Item1,1,2,3,NaN
Item2,4,5,6,7
Item3,8,9,NaN,NaN
Run Code Online (Sandbox Code Playgroud)

或者你甚至可以打印空白字段:

Item1,1,2,3,
Item2,4,5,6,7
Item3,8,9,,
Run Code Online (Sandbox Code Playgroud)

当然,为了正确填充,您需要知道所有项目的最大值是多少.使用上述任一格式,您可以使用标准文件读取功能之一,例如TEXTSCAN:

>> fid = fopen('uneven_data.txt','rt');
>> C = textscan(fid,'%s %f %f %f %f','Delimiter',',','CollectOutput',1);
>> fclose(fid);
>> C{1}

ans = 

    'Item1'
    'Item2'
    'Item3'

>> C{2}

ans =

     1     2     3   NaN  %# TEXTSCAN sets empty fields to NaN anyway
     4     5     6     7
     8     9   NaN   NaN
Run Code Online (Sandbox Code Playgroud)