matlab - 在不指定列数的情况下将文本文件加载为二维字符串数组

标签 matlab csv file-io octave

假设我有一个明文文件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
  }
}

显式指定 DelimiterWhitespaceEndOfLine 没有帮助(那么后者有什么意义?);使用其他加载函数(如 textreaddlmread)也不行。起作用的是在上面使用 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,然后拆分行。

此方法中使用的唯一不是低级文件 I/O 的函数是 strsplit。这是 Octave 的内置函数和 Matlab .

关于matlab - 在不指定列数的情况下将文本文件加载为二维字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48463199/

相关文章:

java - 像 PHP 中的文件写入/读取功能

windows - 名称中带有冒号的文件会发生什么情况?

IFFT 后虚部冲突

matlab - 在 Matlab 中读取一个大的结构化文件

python - 如何检查 csv 文件行中是否存在等于变量的字符串

java - Apache CSVParser 不工作

php - 如何使用 PHP 将文件从一个目录复制到另一个目录?

matlab - 一组给定元素的唯一(有限长度)组合 - 在 Matlab 中的实现

regex - matlab正则表达式检查脚本中是否设置了变量

python - 用同一字符串中的单个单词替换字符串的一部分