我在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)
答案 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;
它正常工作。如您所见,您可以轻松修改代码以根据需要定制导入功能。