数据
假定以下数据格式(第一行中有标题行,超过500行):
1, "<LastName> ,<Title>. <FirstName>", <Gender>, 99.9
我的密码
我已经尝试过(IGNORE:请参见下面的编辑):
[flag, name, gender, age] = textread('file.csv', '%d %q %s %f', 'headerlines', 1);
错误
...并获得以下错误消息
error: textread: A(I): index out of bounds; value 1 out of bound 0
error: called from:
error: C:\Program Files\Octave\Octave3.6.2_gcc4.6.2\share\octave\3.6.2\m\io\textread.m at line 75, column 3
任务:
编辑
我忘记了定界符(错误消息在strread.m的不同行上返回失败):
[flag, name, gender, age] = textread('file.csv', '%d %q %s %f', 'headerlines', 1, 'delimiter', ',');
最佳答案
我这样做了,但是它将名称字段的文本限定字符串分成两个单独的字段,因此任何在字符串中包含字段分隔符的文本限定字段都会创建一个额外的输出列(我仍然很想知道为什么%q格式不适用于此字段-也许是空格?):
% Begin CSV Import ============================================================================
% strrep is used to strip the text qualifier out of each row. This is wrapped around the
% call to textread, which brings the comma delimited data in row-by-row, and skips the 1st row,
% which holds column field names.
tic;
data = strrep(
textread(
'file.csv' % File name within current working directory
,'%s' % Each row is a single string
,'delimiter', '\n' % Each new row is delimited by the newline character
,'headerlines', 1 % Skip importing the first n rows
)
,'"'
,''
);
for i = 1:length(data)
delimpos = findstr(data{i}, ",");
start = 1;
for j = 1:length(delimpos) + 1,
if j < length(delimpos) + 1,
csvfile{i,j} = data{i}(start:delimpos(j) - 1);
start = delimpos(j) + 1;
else
csvfile{i,j} = data{i}(start:end);
end
end
end
% Return summary information to user
printf('\nCSV load completed in -> %f seconds\nm rows returned = %d\nn columns = %d\n', toc, size(csvfile)(1), size(csvfile)(2));