【问题标题】:Matlab textscan with fixed width固定宽度的Matlab textscan
【发布时间】:2013-04-29 10:00:33
【问题描述】:

我必须读取这样的文件

10001   3          5.0000      30.0         0.0000      25.6         0.0000      10.0
10002   1         25.0000                   0.0000                   4.6887      58.2
10003   5         45.0000      20.0         0.0000                  14.7608          
10004   5         65.0000                   0.0000                   8.8791          
10005   1         85.0000                   0.0000                   6.3128      00.0

哪里的文件格式像这样'%5i%5i%%10.4f%8.1f%10.4f%8.1f%10.4f%8.1f'

我正在使用以下代码

n_xyz_filename = input('\nSelect the file. ', 's');
n_xyz_file = fopen(n_xyz_filename, 'r');
n_xyz = textscan(n_xyz_file, '%5i%5i%10.4f%8.1f%10.4f%8.1f%10.4f%8.1f');
fclose(n_xyz_file);

但我不断收到以下错误

???错误使用 ==> textscan 格式错误的格式字符串。

我真的看不懂!

编辑

正如答案所说,正确的代码是:

n_xyz_filename = input('\nSelect the file. ', 's');
n_xyz_file = fopen(n_xyz_filename, 'r');
n_xyz = textscan(n_xyz_file, '%5d%5d%10.4f%8.1f%10.4f%8.1f%10.4f%8.1f');
fclose(n_xyz_file);

用“d”(代表十进制)代替“i”

【问题讨论】:

  • 您确定文件是固定宽度而不是制表符分隔的吗?也许尝试dlmread\t 作为分隔符?
  • 我确定是固定的:我刚刚将它生成为一个字符串。
  • @Dan:不幸的是,它不是tab-formatted。

标签: matlab textscan


【解决方案1】:

问题在于格式说明符itextscan 无法识别。如果你想表示一个整数,你应该使用d。因此正确的语法是:

n_xyz = textscan(n_xyz_file, '%5d%5d%10.4f%8.1f%10.4f%8.1f%10.4f%8.1f');

【讨论】:

  • 是的!这几乎完成了!但是现在我有另一个问题:矩阵 n_xyz 现在显示为以下n_xyz = [3498x1 int32] [3498x1 int32] [3498x1 double] [3498x1 double] [3498x1 double] [3498x1 double] [3498x1 double] [3497x1 double] 并且每个组件都显示为向量
  • @MicheleRedaelli 没有问题:您的文件似乎包含 3498 行(显然是 8 列,如格式字符串中指定的那样)。因此,每个单元格都包含从相应列中提取的所有值。要访问每个单元格,请使用大括号 ({}),例如第二列的值为 n_xyz{2}...
  • 非常感谢你让我开心!我讨厌教授要求你做一些不解释基本的事情!