【问题标题】:Octave / Matlab - Reading fixed width fileOctave / Matlab - 读取固定宽度文件
【发布时间】:2017-03-16 16:56:06
【问题描述】:

我有一个固定宽度的文件格式(原始文件是 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 等似乎也很困难。

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

谢谢。

【问题讨论】:

  • 如果列间距相同,即使它们被压在一起,您也可以执行 str2double(A(1:8)) 和 str2double(A(9:16)) 和以此类推。只要列长度不变,这可能会有所帮助。我目前没有 MATLAB 访问权限或时间来给出完整的答案

标签: matlab file format octave


【解决方案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 实际上是整个文件而不是一行,这也将起作用。

【讨论】:

  • 谢谢,以上两个答案都有帮助,我会接受这个,因为我正在使用非常相似的东西,我没想过使用正则表达式。
【解决方案2】:

你没有提到你需要哪类输出,但我想你需要从文件中读取双精度来进行一些计算。我假设您能够读取您的文件,因为您已经有了 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 结果将是一个双精度数组。

【讨论】:

    猜你喜欢
    • 2016-01-18
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多