登录论坛

查看完整版本 : 在MATLAB中导入CSV文件的最快方法


poster
2019-12-10, 20:30
我已经编写了一个脚本,将其输出保存到CSV文件中,以供以后参考,但是用于导入数据的第二个脚本花费大量时间来读回。

数据格式如下:

Item1,val1,val2,val3 Item2,val4,val5,val6,val7 Item3,val8,val9 标头位于最左侧的列上,而数据值占据该行的其余部分。一个主要的困难是,每个测试项目的数据值数组的长度可以不同。我会将其保存为结构,但是我需要能够在MATLAB环境之外进行编辑,因为有时我必须删除未安装MATLAB的计算机上的不良数据行。确实,我的问题之一是:是否应该以其他格式保存数据?

问题的第二部分:我尝试了importdata (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/importdata.html) , csvread (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/csvread.html)和dlmread (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dlmread.html) ,但是我不确定哪个最好,或者是否有更好的解决方案。现在,我正在使用自己的脚本,使用了loop和fgetl (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/fgetl.html) ,这对于大型文件来说非常慢。有什么建议么?

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); (我知道这可能是编写得很糟糕的代码-我是工程师,而不是程序员,请不要对我大吼-但是,任何改进建议都将受到欢迎。)



回答:

如果在第一个脚本创建文件时可以使用NaN (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/nan.html)值填充文件,则可能会使数据更易于阅读:

Item1,1,2,3,NaN Item2,4,5,6,7 Item3,8,9,NaN,NaN 或者您甚至可以只打印空白字段:

Item1,1,2,3, Item2,4,5,6,7 Item3,8,9,, 当然,为了正确填充,您需要事先知道所有项目的最大数值是多少。无论采用上述哪种格式,您都可以使用一种标准的文件读取功能,例如TEXTSCAN (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/textscan.html) :

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

更多&回答... (https://stackoverflow.com/questions/2043721)