假设我有一个明文文件test.dat
:
foo bar baz
qux ham spam
我知道想将其作为二维元胞数组加载到 Octave(或 Matlab,如果需要),保留以空格和换行符编码的结构。据我了解the documentation , 以下应该是要走的路:
format = '%s';
file = fopen('test.dat');
data = textscan(file,format);
fclose(file);
disp(data);
然而,这只会将数据加载为一维数组:
{
[1,1] =
{
[1,1] = foo
[2,1] = bar
[3,1] = baz
[4,1] = qux
[5,1] = ham
[6,1] = spam
}
}
显式指定 Delimiter
、Whitespace
和 EndOfLine
没有帮助(那么后者有什么意义?);使用其他加载函数(如 textread
或 dlmread
)也不行。起作用的是在上面使用 format = '%s%s%s'
但这需要我以某种方式确定列数,函数应该能够自己完成。
因此我问:是否有任何内置函数可以满足我的需求?我对自己编写此类函数的方法不感兴趣——我有信心我可以做到这一点,但这正是我想要避免的(因为我需要用它来展示良好的实践,而不是重新发明轮子)。
相关问答(都知道列数):
最佳答案
您可以使用 readtable
data = readtable('test.txt', 'ReadVariableNames', false, 'Delimiter', ' ')
输出:
Var1 Var2 Var3
_____ _____ ______
'foo' 'bar' 'baz'
'qux' 'ham' 'spam'
如果你想要一个单元格,而不是一个表格,你可以使用
data = table2cell( data );
>> data = {'foo' 'bar' 'baz'
'qux' 'ham' 'spam'}
我不确定readtable
是Octave方法,好像是on GitHub但我没有要检查的安装。它于 2013 年引入 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'}
此方法假定每行 data
将具有相同数量的元素(每行中的分隔符数量相同)。如果您不能假设,那么更安全的方法是执行 data{end+1,1} = A
,然后拆分行。
关于matlab - 在不指定列数的情况下将文本文件加载为二维字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48463199/