首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MATLAB中导入CSV文件的最快方法

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

Stack Overflow用户
提问于 2010-01-12 01:56:30
回答 4查看 50K关注 0票数 8

我已经编写了一个脚本,将其输出保存到CSV文件中以供以后引用,但是第二个用于导入数据的脚本需要花费大量的时间来读回它。

数据格式如下:

代码语言:javascript
运行
复制
Item1,val1,val2,val3
Item2,val4,val5,val6,val7
Item3,val8,val9

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

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

代码语言:javascript
运行
复制
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);

(我知道这可能是写得很糟糕的代码--我是工程师,不是程序员,请不要对我大喊大叫--不过,任何改进建议都是受欢迎的。)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-12 02:28:40

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

代码语言:javascript
运行
复制
Item1,1,2,3,NaN
Item2,4,5,6,7
Item3,8,9,NaN,NaN

或者,您甚至可以只打印空字段:

代码语言:javascript
运行
复制
Item1,1,2,3,
Item2,4,5,6,7
Item3,8,9,,

当然,为了正确填充,你需要事先知道所有项的最大值是多少。使用上面的任何一种格式,您都可以使用标准文件读取函数之一,例如TEXTSCAN

代码语言:javascript
运行
复制
>> 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
票数 10
EN

Stack Overflow用户

发布于 2010-01-12 02:34:00

而不是一次一个字符地解析字符串textline。您可以使用strtok来拆分字符串,例如

代码语言:javascript
运行
复制
stringParts = {};
tline = fgetl(fid);
if ~ischar(tline), break, end
i=1;
while 1
    [stringParts{i},r]=strtok(tline,',');
    tline=r;
    i=i+1;
    if isempty(r), break; end
end

% store the header
headers{count} = stringParts{1};

% convert the data into numbers
for j=2:length(stringParts)
    data{count}(j-1) = str2double(stringParts{j});
end
count=count+1;
票数 3
EN

Stack Overflow用户

发布于 2016-08-16 03:46:29

我在Matlab中读取csv数据时也遇到过同样的问题,我很惊讶对此的支持是如此之少,但是后来我发现了import data工具。我在r2015b。

在“主页”选项卡的顶部栏上,单击“导入数据”并选择您想要读取的文件。应用程序窗口将如下所示:

Import Data tool screenshot

在"Import Selection“下,你可以选择"generate function",这给了你相当多的定制选项,包括如何填充空单元格,以及你想要的输出数据结构是什么。另外,它是由MathWorks编写的,所以它可能利用了最快的方法来读取csv文件。在我的档案里它几乎是瞬间的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2043721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档