![]() |
在MATLAB中导入CSV文件的最快方法
我已经编写了一个脚本,将其输出保存到CSV文件中,以供以后参考,但是用于导入数据的第二个脚本花费大量时间来读回。
数据格式如下: Item1,val1,val2,val3 Item2,val4,val5,val6,val7 Item3,val8,val9 标头位于最左侧的列上,而数据值占据该行的其余部分。一个主要的困难是,每个测试项目的数据值数组的长度可以不同。我会将其保存为结构,但是我需要能够在MATLAB环境之外进行编辑,因为有时我必须删除未安装MATLAB的计算机上的不良数据行。确实,我的问题之一是:是否应该以其他格式保存数据? 问题的第二部分:我尝试了[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/importdata.html"]importdata[/URL] , [URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/csvread.html"]csvread[/URL]和[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dlmread.html"]dlmread[/URL] ,但是我不确定哪个最好,或者是否有更好的解决方案。现在,我正在使用自己的脚本,使用了loop和[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/fgetl.html"]fgetl[/URL] ,这对于大型文件来说非常慢。有什么建议么? 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); (我知道这可能是编写得很糟糕的代码-我是工程师,而不是程序员,请不要对我大吼-但是,任何改进建议都将受到欢迎。) [B]回答:[/B] 如果在第一个脚本创建文件时可以使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/nan.html"]NaN[/URL]值填充文件,则可能会使数据更易于阅读: 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,, 当然,为了正确填充,您需要事先知道所有项目的最大数值是多少。无论采用上述哪种格式,您都可以使用一种标准的文件读取功能,例如[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/textscan.html"]TEXTSCAN[/URL] : >> 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 [url=https://stackoverflow.com/questions/2043721]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 05:02。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.