爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 10763|回复: 7

[混合编程] MatLab读取有文件头的.dat格式二进制文件两种方法

[复制链接]

新浪微博达人勋

发表于 2015-6-10 11:40:52 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 映山红 于 2015-6-10 11:39 编辑

       二进制文件最令人头疼,因为你不知道文件堆放方式,而带有文件头的二进制文件更是烦人。这里需处理0.5度的CRU平均气候态(1961-1990)格点温度、风速和水汽压资料。CRU高分辨率格点资料下载网址http://www.cru.uea.ac.uk/cru/data/hrg/(图1)
    只有CRU CL v.1.0符合我们的要求。点击Link to data (at IPCC DDC)转到下面数据下载页,发现数据为二进制格式,下载解压后,后缀名竟然为.dat!顿时感觉整个人都不好了!(图2)
第1种方法用importdata读取之
   a=importdata('F:\Data\CRU_0.5\ctmp6190\ctmp6190.dat'); 结果为结构体a,包含data、textdata和colheaders三个子变量。(图3)        
   a.colheaders中的数据如下:(图4)
   a.data中的数据如下:(图5)

   a.colheaders与a.data第1行一一对应可得数据属性:grd_sz=0.5 ,xmin=0.2500,ymin=-89.7500,xmax=359.7500, ymax=89.7500,n_cols=720,n_rows=360,n_months=12。说明数据为0.5度,经度:0.25:0.5:359.75,纬度:-89.75:0.5:89.75,720列(经向),360行(纬向),12个月。a.data第1行以后的主体数据个数应为:720 x 360 x 12。但由于文件头的存在,主体数据已变形为8列数据。下面得猜测原数据如何存放,以确定该如何还原。我试了很多次,用contourf绘图后都是乱码,说明还原方式错误。真令人头疼!
   不过最后还是被我还原成功!代码如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a=importdata('F:\Data\CRU_0.5\ctmp6190\ctmp6190.dat');
b=a.data(2:388801,:)';    %去掉第1行
b(b<-9000)=nan;            %处理缺失值
b=b*0.1;                    %乘以0.1还原成实际温度值
c=reshape(b,720,360*12);      %还原成720 x 4320 的矩阵
t(1:360,1:720,1:12)=0;
for i=1:12
t(:,:,i)=rot90(c(1:720,(i-1)*360+1:i*360));    %还原成360 x 720 x 12 的三维格点矩阵
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    绘制1961年的全球温度气候态分布图:contourf(t(:,:,1)),图是正确的,还原数据完成!(图6)


第2种方法用fopen等语句读取
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fid=fopen('F:\Data\CRU_0.5\ctmp6190\ctmp6190.dat','r');
title1=fgetl(fid) %用fgetl函数读掉前两行头文件,后面fscanf函数接着从第3行开始读取
title2=fgetl(fid)
a=fscanf(fid,'%f',[720,inf]);   %以720 x inf (4320) 矩阵形式读出
a(a<-9000)=nan;
c=a*0.1;
t(1:360,1:720,1:12)=0;
for i=1:12
t(:,:,i)=rot90(c(1:720,(i-1)*360+1:i*360));    %还原成360 x 720 x 12 的三维格点矩阵
end

fclose(fid)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    第1种方法用importdata读取时,由于文件头存在,导致矩阵变形,造成后面还原数据的困难。(若另存.dat文件副本,强行把后缀名改为.txt,然后打开,删除头文件,再把后缀名改为.dat,用importdata读取后数据仅为1列,仍需设法还原之)。相比之下,第2种方法读取数据就要简单迅速得多了。













CRU高分辨率资料下载列表

CRU高分辨率资料下载列表

IPCC DDC

IPCC DDC

三个子变量

三个子变量

a.colheaders中数据

a.colheaders中数据

a.data中数据

a.data中数据

1961年全球温度气候态分布图

1961年全球温度气候态分布图

评分

参与人数 2金钱 +33 贡献 +11 体力 +40 收起 理由
Aires + 18 + 6 + 40 赞一个!
mofangbao + 15 + 5

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2015-6-10 15:09:26 | 显示全部楼层
最普通的读取文件的方式,最重要的就是了解熟悉文件的数据结构。
另外强行更改后缀名其实对读取文件没有任何影响。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2015-6-10 15:04:51 | 显示全部楼层
感谢楼主分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-6-10 16:04:14 | 显示全部楼层
二爷名声在外 发表于 2015-6-10 15:09
最普通的读取文件的方式,最重要的就是了解熟悉文件的数据结构。
另外强行更改后缀名其实对读取文件没有任 ...

这里改后缀名,只是为了能直接打开文件,以手动去掉文件头
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-10 17:19:22 | 显示全部楼层
感谢楼主分享,非常受用
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-4-19 12:44:36 | 显示全部楼层
如果文件头和内容不分行,混合在一起,而文件头为文本,内容为二进制,又该怎么办呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-8-10 21:03:54 | 显示全部楼层
多谢楼主分享,好帖子收藏了,哈哈
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-12-14 09:25:17 | 显示全部楼层
感谢楼主!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表