我编写了一个脚本,将其输出保存为CSV文件以供日后参考,但导入数据的第二个脚本需要花费大量时间才能将其读回。
数据采用以下格式:
Item1,val1,val2,val3
Item2,val4,val5,val6,val7
Item3,val8,val9
其中标题位于最左侧列,并且数据值占据行的其余部分。一个主要困难是数据值的数组对于每个测试项可以是不同的长度。我将它保存为结构,但我需要能够在MATLAB环境之外编辑它,因为有时我必须在没有安装MATLAB的计算机上删除坏数据行。所以,我的问题的第一部分是:我应该以不同的格式保存数据吗?
问题的第二部分: 我已经尝试了importdata,csvread和dlmread,但我不确定哪个最好,或者是否有更好的解决方案。现在我正在使用我自己的脚本使用循环和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);
(我知道这可能是非常复杂的代码 - 我是工程师,而不是程序员,请不要对我大喊大叫 - 但欢迎任何改进建议。)
答案 0 :(得分:10)
如果您在第一个脚本创建时使用NaN
值填充文件,则可能会使数据更易于阅读:
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:
>> 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
答案 1 :(得分:3)
不是一次解析字符串 textline 一个字符。您可以使用 strtok 来打破字符串,例如
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;
答案 2 :(得分:1)
我在Matlab中读取csv数据时遇到了同样的问题,我很惊讶对此有多少支持,但后来我才找到了导入数据工具。我在r2015b。
在“主页”标签的顶部栏中,点击“导入数据”,然后选择您要阅读的文件。应用程序窗口会出现如下:
在“导入选择”下,您可以选择“生成函数”,它为您提供了相当多的自定义选项,包括如何填充空单元格以及您希望输出数据结构的内容。另外它是由MathWorks编写的,所以它可能使用最快的方法来读取csv文件。我的档案几乎是即时的。
答案 3 :(得分:0)
Q1)如果您知道最大列数,则可以使用NaN填充空条目 此外,如果所有值都是数字,您真的需要“Item#”列吗?如果是,则只能使用“#”,因此所有数据都是数字。
Q2)读取num的最快方法。来自没有mex文件的文件的数据是csvread。 我尽量避免在csv文件中使用字符串,但如果必须,我会使用我的csv2cell函数:
http://www.mathworks.com/matlabcentral/fileexchange/20135-csv2cell