我有一个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','')
我有两个问题:
我认为应该是
的格式规范'%*11c %4d %2d %4c %5d %*3c'
ignore year month element valuei ignore
------------------
repeat this part 31 times
我怎样才能重复那部分31次并将所有部分连在一起?
答案 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,然后是其余的。