Matlab:如何读取恒定宽度的文本文件并将其转换为矩阵?

时间:2016-06-17 12:12:26

标签: matlab matrix text-files

我有一个ASCII文本文件,每行都有格式

------------------------------
Variable   Columns   Type
------------------------------
ID            1-11   Character
YEAR         12-15   Integer
MONTH        16-17   Integer
ELEMENT      18-21   Character
VALUE1       22-26   Integer
MFLAG1       27-27   Character
QFLAG1       28-28   Character
SFLAG1       29-29   Character
VALUE2       30-34   Integer
MFLAG2       35-35   Character
QFLAG2       36-36   Character
SFLAG2       37-37   Character
  .           .          .
  .           .          .
  .           .          .
VALUE31    262-266   Integer
MFLAG31    267-267   Character
QFLAG31    268-268   Character
SFLAG31    269-269   Character
------------------------------

我只需要变量"年" "一个月" "元件"和" valuei" i = 1,2,...,31(每行有31个值)

参数(如MFLAGi)可以在其位置或空白区域中包含角色。 也许价值可能无法用数字填充所有空间,因此可以有空间。

我文本文件中的两个示例行

USC00190736189301TMAX   33  6  117  6    0 I6  -89  6  -28  6  -83  6  -67  6  -67  6  -28  6   -6  6 -139  6 -111  6 -117  6  -89  6 -106  6 -111  6 -106  6 -106  6  -39  6  -78  6  -61  6  -33  6   -6  6    6  6   39  6   28  6    6  6  -61  6   61  6   56  6    0  6
USC00190736189301TMIN  -56  6   11 I6 -106  6 -161  6 -106  6 -133  6 -144  6 -117  6 -161  6 -156  6 -206  6 -183  6 -161  6 -161  6 -139  6 -178  6 -189  6 -161  6 -133  6 -150  6 -156  6 -156  6 -100  6  -50  6  -39  6  -67  6  -78  6 -111  6  -94  6  -33  6  -50  6

例如在第1行中,value1仅使用其中的2个空格(' 33') MFLAG1和QFLAG1都是白色空间。

我想把"年" "一个月" "元件"和" valuei"在一个矩阵中,取决于"元素"值选择一些行并制作我的最终矩阵我该怎么做?

我的想法:

%open file
fid = fopen('myt.txt')

% read from file 
%'whitespace','' do not overlook white spaces in counting 
C  = textscan(fid , formatspec ,'whitespace','')

我有两个问题:

  1. 我认为应该是

    的格式规范
    '%*11c    %4d    %2d    %4c          %5d       %*3c'
    ignore   year   month  element      valuei    ignore
                                        ------------------
                                     repeat this part 31 times
    
  2. 我怎样才能重复那部分31次并将所有部分连在一起?

    1. 我最终得到一个单元格数组C,因为" element"是一个字符串,我不能将其改为矩阵。显然C是逐列的,每列是一个完整的字符串。那么如何逐行访问读取数据以选择我需要的行(根据"元素"的值)?
    2. 我是用错误的方法做我想做的事吗?我该怎么办?

1 个答案:

答案 0 :(得分:0)

对于(1),您可以使用repmat:

idspec = ['%*11c    %4d    %2d    %4c '];
valuespec = repmat('%5d %*3c',[1 31]);
filespec = [idspec valuespec];

(或类似的东西)

对于(2),我可以看到一些选项:

a)您可以读取文件两次,一旦忽略字符列,并使用' collectoutput'选项,这样C基本上包含一个矩阵。你可以通过忽略除ELEMENT之外的所有内容再次阅读,这样C就会有剩余的信息。

b)使用' collectoutput',你有一个月的C,然后是ELEMENT,然后是其余的。