Octave / Matlab - 读取固定宽度的文件

Octave / Matlab - Reading fixed width file

我有一个固定宽度的文件格式(原始文件是为 Fortran 例程输入的)。该文件的几行如下所示:

1078.0711005.481 932.978 861.159 788.103 716.076

实际应该怎么读:

1078.071 1005.481 932.978 861.159 788.103 716.076

我尝试了各种方法,textscan、fgetl、fscanf 等,但是我遇到的问题是,如上所示,有时由于原始文件的固定宽度,某些数字之间没有空格。我似乎找不到直接阅读它们的方法,也无法更改原始格式。

到目前为止我想出的最好办法是使用 fgetl 读取整行,然后我将结果重塑为 8,6 数组

A=fgetl
A=reshape(A,8,6)

生成以下结果

11
009877
703681
852186
......
049110
787507
118936

所以现在我有了上面的内容,我想我可以将那个数组的行连接在一起以形成每个数字,尽管这看起来也很困难,而且已经尝试过 strcat、vertcat 等。

所有这一切似乎还有很长的路要走,所以希望得到一些更好的建议。

谢谢。

您没有提到您需要哪个 class 输出,但我想您需要从文件中读取双精度值来进行一些计算。我假设您能够读取您的文件,因为您已经有了 reshape() 函数的结果。但是,使用 reshape() 函数对您的情况效率不高,因为您的变量大小不固定(即 1078.071 和 932.978)。

如果我没有误解你的问题:

  1. 您的数据在某些部分被压缩(即 1078.0711005.481 而不是 1078.071 1005.481).

  2. 变量的小数部分有3位。

首先我们需要去掉字符串数组中的空格:

A = A(~ismember(A,' '));

然后利用小数部分为3位的信息:

iter = length(strfind(A, '.'));
for k=1:iter   
    [stat,ind] = ismember('.', A);
    B(k)=str2double(A(1:ind+3));
    A = A(ind+4:end); 
end

B 结果将是一个双精度数组。

如果您可以依靠三位小数,则可以使用简单的正则表达式来生成缺失的空格:

s = '1078.0711005.481 932.978 861.159 788.103 716.076';
s = regexprep(s, '(\.\d\d\d)', ' ');
c = textscan(s, '%f');

现在 c{1} 包含您的号码。如果 s 实际上是整个文件而不是一行,这也将起作用。