csvread在MATLAB中删除行

时间:2015-09-13 17:41:38

标签: matlab csv file-writing

我在5列中创建了一些随机数据并将其存储为CSV文件。这很好用,我的CSV实际上包含1001行;我的数据与标题(我在电子表格编辑器中打开它检查了这一点)。但是,当我使用csvread再次在MATLAB中读取它时,如果我没有指定分隔符,并且当我指定分隔符data仅包含957行时,我会收到错误,因此标题和前42行丢失了。这是怎么回事?

代码:

A = rand(1e3,5);
out = fopen('output.csv','w');
fprintf(out,['ColumnA', ',', 'ColumnB', ',', 'ColumnC',  ',', 'ColumnD',  ',', 'ColumnE','\n']);
fclose(out);
dlmwrite('output.csv', A, 'delimiter',',','-append');
data = csvread('output.csv',',');

错误:

  

使用dlmread时出错(第139行)   文件和格式字符串不匹配。   无法从文件中读取数字(第1u行,第1u行)==> ColumnA,ColumnB,ColumnC,ColumnD,ColumnE \ n

     

csvread错误(第48行)       m = dlmread(filename,',',r,c);

我是否在写作或阅读文件时遗漏了一些蠢事?

我在64位Windows 7机器上运行MATLAB R2012a。 (虽然我希望在下个月升级到R2015b)

2 个答案:

答案 0 :(得分:3)

原因是您使用了无效的csvread语法。来自help csvread

  

M = csvread('FILENAME')读取逗号分隔值格式的文件       文件名。结果以M形式返回。文件只能包含       数值。

     

M = csvread('FILENAME',R,C)从逗号分隔值中读取数据       从行R和列C开始的格式化文件.R和C为零 -       基于R = 0和C = 0指定文件中的第一个值。

     

M = csvread('FILENAME',R,C,RNG)仅读取指定的范围       通过RNG = [R1 C1 R2 C2]其中(R1,C1)是左上角       要读取的数据和(R2,C2)是右下角。 RNG       也可以使用电子表格表示法指定,如RNG ='A1..B7'。

无法告诉csvread要使用的分隔符。当你以这种方式调用它时,它会将'解释为数字44(在ascii中)并将其用作起始行。

请改为:data = csvread('output.csv',1);

答案 1 :(得分:2)

首先,在MATLAB 2014b上,我有一个不同的错误

  

使用dlmread时出错(第138行)   HeaderLines必须是整数值。   csvread出错(第47行)       m = dlmread(filename,',',r,c);

在MATLAB中,我通常通过其数据导入界面导入数据。在Home标签上,点击Import Data,您有很多选项可以确保数据导入正确。接口的最佳部分是代码生成功能。您可以选择生成MATLAB实际用于导入数据的代码。例如,这就是我得到的:

filename = 'output.csv';
delimiter = ',';
startRow = 2;
formatSpec = '%f%f%f%f%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'HeaderLines', startRow-1, 'ReturnOnError', false);
fclose(fileID);
ColumnA = dataArray{:, 1};
ColumnB = dataArray{:, 2};
ColumnC = dataArray{:, 3};
ColumnD = dataArray{:, 4};
ColumnE = dataArray{:, 5};
clearvars filename delimiter startRow formatSpec fileID dataArray ans;

它正常工作。如您所见,您可以轻松修改代码以根据需要定制导入功能。