我想将一个文件读入Matlab,作为包含奇数格式信息的文件的矩阵。
文件data.txt的数据写为:
04001400 HI 34.50 118.27 19480701 08 LST
0 0 0 0 0 0 0 0 0 0 0 0
MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480801 08 LST
0 0 0 0 0 0 0 0 0 0 0 0
MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480901 08 LST
0 0 0 0 0 0 0 0 0 0 0 0
MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
第一个数字是站号,HI是一个案例,第三个和第四个数字是纬度和长坐标,另一个数字是年,月,日,而另一个数字(08)是时区,其次是由LST意味着时间框架。以下24个数字或上例中的0和MIS是特定区域和时间的值。我试图将文件的内容存储为这种维度[n x 31]格式的矩阵(其中31是列数,n是文件中的总行数):
04001400 HI 34.50 118.27 19480701 08 LST 0 0 0 0 0 0 0 0 0 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480801 08 LST 0 0 0 0 0 0 0 0 0 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480901 08 LST 0 0 0 0 0 0 0 0 0 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
我尝试过基于函数textscan()的编码方式:
fid = fopen('data.txt', 'rt');
data = textscan(fid, '%d %s %f %f %s %d %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s');
fclose(fid);
但它不像我上面所描述的那样有用。有没有办法可以做到这一点?谢谢你的帮助。
注意:我想将日期(19480701)读作字符串,以便稍后将其格式化为日期类型。
答案 0 :(得分:1)
您的示例代码不起作用,因为textscan()
假定文件中的每一行都具有相同的格式。也就是说,要使用textscan()
,每行必须具有相同数量的列,包含相同类型的数据。
我会将数据视为逗号分隔值格式。将每一行拆分为由空格分隔符like suggested by Rob Henson here:
分隔的标记列表>> string = 'Need-to-split-this-string'
string =
Need-to-split-this-string
>> parts = strread(string,'%s','delimiter','-')
parts =
'Need'
'to'
'split'
'this'
'string'
您需要循环读取所有行的文件。您的数据似乎有三行的节,因此一次处理三行数据。
或者,您可以对文本文件执行预处理运行,以将三行的每个节重新格式化为一行。 (只需删除每三个换行符中的第一个和第二个。)然后使用正则表达式用逗号替换空格。你最终会得到类似的东西:
04001400,HI,34.50,118.27,19480701,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS
04001400,HI,34.50,118.27,19480801,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS
04001400,HI,34.50,118.27,19480901,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS
然后采用的格式为textscan()
或更好,csvread()
。
答案 1 :(得分:0)
实际上,您编写的代码应该非常接近工作。你只需要告诉textscan()将换行符视为普通的空白字符。
尝试删除格式字符串中的空格,并使用'whitespace'参数添加'\ n':
data=textscan(fid, '%d%s%f%f%s%d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s','whitespace',' \b\t\n';
另外,请务必仔细检查输入文件是否以任何空行结束。这似乎搞乱了textscan()。
希望这有帮助!