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

时间:2017-03-15 21:34:49

标签: matlab file format octave

我有一个固定宽度的文件格式(原始输入为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等。

所有这些看起来都很长,因此希望得到一些更好的建议。

感谢。

2 个答案:

答案 0 :(得分:1)

如果你可以依赖三个十进制数字,你可以使用一个简单的正则表达式来生成缺少的空格:

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

现在c{1}包含您的号码。如果s实际上是整个文件而不是一行,那么这也会有效。

答案 1 :(得分:0)

你还没有提到你需要哪种类型的输出,但我想你需要从文件中读取双打以进行一些计算。我假设您已经能够读取文件,因为您已经有reshape()函数的结果。但是,使用reshape()函数对您的情况不会有效,因为您的变量不是固定大小的(即1078.071和932.978)。

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

  1. 您的数据在某些部分被压扁(即1078.0711005.481) 1078.071 1005.481)。

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

  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将成为一系列双打。

相关问题