读取具有固定字段长度的文件

时间:2015-10-19 19:01:53

标签: matlab decimal precision scanf

我需要使用MATLAB fscanf命令读取ASCII数据文件。数据基本上是具有固定字段长度和精度的浮点数。在每行数据文件中有10列数值,行数从一个文件到另一个文件不等。以下是第一行的示例:

0.000  0.000  0.005  0.000  0.010  0.000  0.015  0.000  0.020 -0.000

字段宽度为7,精度为3.

我试过了:

x = fscanf(fid,'%7.3f\r\n');
x = fscanf(fid,[repmat('%7.3f',1,10) '\r\n']);

但他们什么也没有回来!

当我没有指定字段和精度时,例如x = fscanf(fid,'%f');,它会读取所有数据但是正则一些数据占用正好7个空格(例如158.000)它连接两个连续的数字会导致输出错误。这是一个例子:

0.999158.000

它将其显示为0.999158.000

任何提示或帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

如果您的数据可能没有空格分隔(在您在问题中的示例中为0.999158.000),您可以尝试使用textscan来读取文件。

请注意,使用此格式时,您无法输入-158.000。

然而,使用此格式,您不能拥有-158.000之类的值 由于textscan返回cellarray,您可能需要将cellarray转换为矩阵(如果您不喜欢使用cellarray)。

fp=fopen('input_file_5.txt')
x = textscan(fp,repmat('%7.3f',1,10))
fclose(fp)
m=[x{:}]

输入文件

  0.999130.000  0.005  0.000  0.010  0.000  0.015  0.000  0.020 -0.000
  0.369-30.000123.005  0.000  0.040  0.000  0.315  0.000  0.020-10.000

<强>输出

m =

Columns 1 through 8

0.9990  130.0000    0.0050         0    0.0100         0    0.0150         0
0.3690  -30.0000  123.0050         0    0.0400         0    0.3150         0

Columns 9 through 10

0.0200         0
0.0200  -10.0000

希望这有帮助。

答案 1 :(得分:1)

要读取问题中指定的具有明确定义输入的ASCII文本文件,您应使用dlmread函数。

>> X = dlmread(filename, delimiter);

会将filename的数字数据(delimiter)与X分隔到>> X = dlmread(filename, ' '); 的数据中。对于你的情况,你可以使用

' '

因为您的数据是以空格Running command: ga("send", "pageview", undefined) 分隔的。