Matlab读取固定宽度的文本文件

Matlab to read in fix-width text file

我有一个如下所示的文本文件:

TestData                                                                     

  6.84 11.31 17.51 22.62 26.91 31.98 36.47 35.85 28.47 20.57 10.50  6.37  test1
  0.24  2.62  4.94  7.17 10.39 15.37 18.73 18.29 12.26  6.46  1.15 -0.33  test2
 68.47 95.04156.07218.39304.31320.22311.69269.22203.01135.60 68.18 55.09  test3

 68.47 95.04156.07218.39304.31320.22311.69269.22203.01135.60 68.18 55.09  test4
...

如您所见,前两行是要忽略的注释。在下面的行中,每行末尾也有注释。每个数字都是 %6f 的形式。另外,中间有空行。

我想将所有数字读入矩阵以绘制图表。我尝试使用 textscan,但在忽略最后一列、空白行和读入连接的数字时遇到了问题(例如,行中的一些数字:test4)。

这是我现在的代码:

data=dir('*.txt');
formatspecific='%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f';
for i=1:length(data);
    TestData1=data(i).name;
    tempData=textscan(TestData1,formatspecific,'HeaderLines',2);
end

有人可以帮忙制作一个示例代码来改进文本扫描部分吗?

要使用 textscan 读取文件,您必须在调用 textscan 之前 "open" 并在之后 "close" 它;你应该使用

  • fopen打开输入文件
  • fclose关闭输入文件

textscan returns a cellarray 从输入文件读取的内容;由于您正在读取多个文件,因此您应该更改管理 textscan 返回的 cellarray 的方式,实际上,就像现在在您的代码中一样,数据在每次迭代时都会被覆盖。

一种可能是将数据存储在 struct 的数组中,例如,2 fields:输入文件的名称和数据。

另一种可能是生成一个struct,每个字段都包含从输入文件中读取的数据;您可以自动生成文件的名称。

另一种可能是将它们存储到矩阵中。

此后,您可以找到实现了这三个备选方案的脚本。

代码已更新(收到评论后)

为了能够将95.04156.07等数据正确读取为95.04156.07,应将格式说明符从%6f修改为%6.2f

% Get the list of input data
data=dir('input_file*.txt');
% Define the number of data column
n_data_col=12;
% Define the number of heared lines
n_header=2;
% Build the format specifier string
% OLD format specifier
formatspecific=[repmat('%6f',1,n_data_col) '%s']
% NEW format specifier
formatspecific=[repmat('%6.2f',1,n_data_col) '%s']
% Initialize the m_data matrix (if you know in advance the numer of row of
% each input file yoiu can define since the beginning the size of the
% matrix)
m_data=[];
% Loop for input file reading
for i=1:length(data)
   % Get the i-th file name
   file_name=data(i).name
   % Open the i-th input file
   fp=fopen(file_name,'rt')
   % Read the i-th input file
   C=textscan(fp,formatspecific,'headerlines',n_header)
   % Close the input file
   fclose(fp)
   % Assign the read data to the "the_data" array struct
   the_data(i).f_name=file_name
   the_data(i).data=[C{1:end-1}]
   % Assign the data to a struct whos fileds are named after the inout file
   data_struct.(file_name(1:end-4))=[C{1:end-1}]
   % Assign the data to the matric "m_data
   m_data=[m_data;[C{1:end-1}]]
end

输入文件

TestData                                                                     

  6.84 11.31 17.51 22.62 26.91 31.98 36.47 35.85 28.47 20.57 10.50  6.37  test1
  0.24  2.62  4.94  7.17 10.39 15.37 18.73 18.29 12.26  6.46  1.15 -0.33  test2
 68.47 95.04156.07218.39304.31320.22311.69269.22203.01135.60 68.18 55.09  test3

 68.47 95.04156.07218.39304.31320.22311.69269.22203.01135.60 68.18 55.09  test4

输出

m_data =

  Columns 1 through 7

    6.8400   11.3100   17.5100   22.6200   26.9100   31.9800   36.4700
    0.2400    2.6200    4.9400    7.1700   10.3900   15.3700   18.7300
   68.4700   95.0400  156.0700  218.3900  304.3100  320.2200  311.6900
   68.4700   95.0400  156.0700  218.3900  304.3100  320.2200  311.6900

  Columns 8 through 12

   35.8500   28.4700   20.5700   10.5000    6.3700
   18.2900   12.2600    6.4600    1.1500   -0.3300
  269.2200  203.0100  135.6000   68.1800   55.0900
  269.2200  203.0100  135.6000   68.1800   55.0900

希望这对您有所帮助。