csvread 在 MATLAB 中删除行

csvread drops rows in MATLAB

我在 5 列中创建了一些随机数据并将其存储为 CSV 文件。这很好用,我的 CSV 实际上包含 1001 行; header 我的数据(我通过在我的电子表格编辑器中打开它来检查它)。但是,当我再次使用 csvread 在 MATLAB 中读取它时,如果我没有指定分隔符,我会收到错误消息,而当我指定分隔符时,data 仅包含 957 行,因此 header 并且缺少前 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',',');

错误:

Error using dlmread (line 139) Mismatch between file and format string. Trouble reading number from file (row 1u, field 1u) ==> ColumnA,ColumnB,ColumnC,ColumnD,ColumnE\n

Error in csvread (line 48) m=dlmread(filename, ',', r, c);

我是不是在写入或读取文件时遗漏了一些愚蠢的东西?

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

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

M = csvread('FILENAME') reads a comma separated value formatted file FILENAME. The result is returned in M. The file can only contain numeric values.

M = csvread('FILENAME',R,C) reads data from the comma separated value formatted file starting at row R and column C. R and C are zero- based so that R=0 and C=0 specifies the first value in the file.

M = csvread('FILENAME',R,C,RNG) reads only the range specified by RNG = [R1 C1 R2 C2] where (R1,C1) is the upper-left corner of the data to be read and (R2,C2) is the lower-right corner. RNG can also be specified using spreadsheet notation as in RNG = 'A1..B7'.

不能告诉csvread使用什么分隔符。当你这样称呼它时,它会将 ' 解释为数字 44(在 ascii 中)并将其用作起始行。

改为这样称呼:data = csvread('output.csv',1);

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

Error using dlmread (line 138) HeaderLines must be integer-valued. Error in csvread (line 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;

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