Wrz*_*mft 3 csv file-io matlab octave
假设我有一个纯文本文件test.dat:
foo bar baz
qux ham spam
Run Code Online (Sandbox Code Playgroud)
我知道想要将其加载到Octave(或必要时的Matlab)作为二维单元阵列,保留以空白和换行编码的结构.根据我对文档的理解,以下应该是要走的路:
format = '%s';
file = fopen('test.dat');
data = textscan(file,format);
fclose(file);
disp(data);
Run Code Online (Sandbox Code Playgroud)
但是,这仅将数据作为一维数组加载:
{
[1,1] =
{
[1,1] = foo
[2,1] = bar
[3,1] = baz
[4,1] = qux
[5,1] = ham
[6,1] = spam
}
}
Run Code Online (Sandbox Code Playgroud)
明确指定Delimiter,Whitespace并且EndOfLine没有帮助(后者的意义是什么?); 也没有使用其他加载函数,如textread或dlmread.format = '%s%s%s'在上面的工作中使用了什么,但这要求我以某种方式识别列的数量,该函数应该能够自己完成.
因此我问:是否有任何内置功能可以满足我的需求?我对自己编写这样一个函数的方式不感兴趣 - 我相信我能做到这一点,但这正是我想要避免的(因为我需要用它来展示良好的实践,因此不能重新发明轮子).
相关问答(所有工作都知道列数):
您可以使用 readtable
data = readtable('test.txt', 'ReadVariableNames', false, 'Delimiter', ' ')
Run Code Online (Sandbox Code Playgroud)
输出:
Var1 Var2 Var3
_____ _____ ______
'foo' 'bar' 'baz'
'qux' 'ham' 'spam'
Run Code Online (Sandbox Code Playgroud)
如果你想要一个单元格而不是桌子,你可以使用
data = table2cell( data );
>> data = {'foo' 'bar' 'baz'
'qux' 'ham' 'spam'}
Run Code Online (Sandbox Code Playgroud)
我不确定这readtable是一个Octave方法,它似乎是在GitHub上,但我没有安装检查.它在2013b中被引入Matlab.
您可以使用较低级别的操作,逐个读取行
fid = fopen('test.txt','r');
data = {};
while ~feof(fid)
line = fgets(fid); % Read line
A = strsplit(line, ' '); % Split on spaces
data(end+1, :) = A; % Append to output
end
fclose(fid);
>> data = {'foo' 'bar' 'baz'
'qux' 'ham' 'spam'}
Run Code Online (Sandbox Code Playgroud)
此方法假定每行将data具有相同数量的元素(每行中的分隔符数相同).如果你不能假设那么,那么一个更安全的方法就是做data{end+1,1} = A,然后分割线.
在该方法中使用的唯一函数,它是不低级别的文件I/O是strsplit.这是Octave和Matlab的内置功能.