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)。
如果我没有误解你的问题:
您的数据在某些部分被压缩(即 1078.0711005.481 而不是
1078.071 1005.481).
变量的小数部分有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
实际上是整个文件而不是一行,这也将起作用。
我有一个固定宽度的文件格式(原始文件是为 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)。
如果我没有误解你的问题:
您的数据在某些部分被压缩(即 1078.0711005.481 而不是 1078.071 1005.481).
变量的小数部分有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
实际上是整个文件而不是一行,这也将起作用。