一. 基本知识: 1. 二进制文件与文本文件的区别: 将文件看作是由一个一个字节(byte) 组成的, 那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是 两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的 0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII 码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记 事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手 工的方式对二进制文件进行编辑了。从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种:ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为: 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字 符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。 2. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“\n”,(如果以"文本"方式打开一 个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n" )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。 注: \n一般会操作系统被翻译成"行的结束",即LF(Line-Feed)\r会被翻译成"回车",即CR(Cariage-Return)对于文本文件的新行,在UNIX上,一般用\n(LF)来表示,Mac上用\r(CR)来表示,Windows上是用\n\r(CR-LF)来表示。 通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如图形或字处理文档),或者 读取鼠标输入,或者读写调制解调器。如果用文本方式打开二进制文件,会把“0D 0A”自动变换成“\n”来存在内存中。写入的时候反向处理。而二进制方式打开的话,就不会有这个过程。但是,Unicode/UTF/UCS格式的文 件,必须用二进制方式打开和读写。上述基础其实大可以略过,简言之,对用户来说:在 matlab 中存储成为二进制还是文本文件取决于fopen的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit等工具打开。二. Matlab的I/O文件操作使用技巧和总结: 关于这些函数,我只是简单说明一下适用的场合和方式。当然MATLAB读取文本文件的方式有很多,不限于我写的这么几个函数。具体使用希望大家自行help,毕竟这个比我讲得要好得多……

1.fopen,fread和fscan

这些都是从c语言遗传来的,具体方法参考c语言就好了~

2.LOAD/SAVE LOAD可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCII data。这些都是比较简单的函数。

3.UIGETFILE/UIPUTFILEUIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。这两个函数会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。UIGETFILE让你选择一个文件来写(类似Windows ‘另存为’选项?)。用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。

4.UIIMPORT/IMPORTDATA

UIIMPORT同上面的UIGETFILE类似,是一个功能强大,易于使用的基于GUI的读取文本文件的函数。这个函数可以用来读取有规律的文本文档。IMPORTDATA在不打开GUI的前提下形成UIIMPORT的功能。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。IMPORTDATA还可以自定义文本文件之前的表头或者描述性文字,并且在读取之后分类进行存储。5.TEXTREAD/STRREAD TEXTREAD 可以用来读ASCII格式的文本和/或数值数据文件。不过打开帮助文档你会发现

刚见到她就要离别啊,是的,可能在之后的MATLAB版本中要删除这一指令。

不过从这来看一下format和param-value表也是极好的。

这些我就不细说了,待会咱们程序见!

STRREAD除是从字符串而不是文件读以外,类似于TEXTREAD。

两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个“两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据,并且你可以改变他们以匹配你特定的应用。

6.DLMREAD/DLMWRITE/CSVREAD DLMREAD 和 DLMWRITE函数能够读写分隔的ASCII data,用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。

dlmread 可以指定分隔符,指定跳过哪些数据,当然这个只能从头开始跳过,不能随便挑,毕竟人家是高级命令~

咱们重点说一下下面两个形式

M = dlmread(filename, delimiter, R,C)

当文件中前面R行C列是无关数据的时候,就可以直接跳过了,你问我delimiter是干啥的?这个是用来指定分隔符的,比如文件的分隔符是 空格就用’\t’,是逗号就用 ’;’等等。

M = dlmread(filename, delimiter, range)

这个是指定读取范围的,比如你想读取第一行第一列到第三行第三列的数据就可以用[0,0,2,2]来代替range,是的,这个是以0为起始的。当然你也可以使用电子表格的形式,这一点见语法。

CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。

用edit csvread查看一下源码,这时候你会发现其实她是基于dlmread来读取的,突然发现还是dlmread亲啊!

好了好了,不要心急,咱们现在就来介绍一下她的优点

1)能够跳过指定行列进行数据读取,比如说数据的前三行

前两列是没用,可以用

filedata=csvread(filename,3,2)

% filename即为你的文件名,另外两个还要说吗?肯定不用了对不对~

2)能够在跳过无用数据的基础之上指定读取范围

比如你想读取跳过3行2列之后第一行第一列到第三行第三列的数据(不要问我为什么都是单数)

Filedata=csvread(filename,3,2,[0,0,2,2])

好了,其他功能就留给你去探索了。

7.WK1READ/WK1WRITEWK1READ 用来读Lotus123 电子数据表文件的数据;WK1WRITE用来写矩阵到Lotus123 电子数据表文件。8.TEXTSCAN

还想让我一点一点说语法,那还是简单粗暴吗!你想我都不想,碰到BOSS是肯定要战场上见真招的!!以后读取数据就用这个就行了,不要在用textread了,要不然会跟不上时代发展的~~

以上是数据格式和程序的一部分,我就根据这个来说一下textscan的用法。

首先,从文件中能发现:含有行标号,日期,时间,经纬度,强度,地点等等,然而我们画图真正能用到的无非就是经纬度还有强度,可能还会用到日期,误差,地点,然而其它的和我们并没有什么关系,所以在提取的时候就可以选择性读取了。

比如我们只要日期,经纬度,强度,位置,但是提取的时候不想要那些汉子(只想妹子)怎么办?没事!看我变~~

fid=fopen(filename);

file_data=textscan(fid,’%*d,%s,%*s,纬度=%f,经度=%f,强度=%f,%*s,%*s,%*s,省=%s,%*[^\n]’);

%*d %*s 表示跳过该列

%s 把日期列作为字符串读取

纬度=%f 表示跳过 纬度= 剩下部分作为浮点数读取

%*[^\n] 表示忽略剩下所有列,当然你要想提取市县也行

返回的file_data是一个元胞数组,在提取其中数据的时候要注意。当然textscan可不止这些功能,比如可以使用treatAsEmpty属性把数据中的na ,NA或是其它一些缺省值作为空值,也可以使用EmptyVlaue属性把空元胞转换为-Inf,使用MutipleDelimAsOne把多个分隔符看作一个,可以使用CollectOutput把单个数组中的类型相同的数据集合到一起,还可以....啊!怎么可以这么强大啊!我说的都累了!!剩下的功能大家可以查看一下帮助文件。

9.XLSREAD XLSREAD用来读Excel的数值和文本数据。此函数需要office的dll支持,有的时候没有完全安装或者非正版office不能使用本函数。具体使用嘛,help里面说的很详细啦,不再赘述了~但是要注意哦,读出来的也是元胞数组,也会出现将数字识别为文本的乌龙,大家使用时要注意。

Micaps是中国气象局存储和下发气象数据的一种数据格式。总共分为19类,均为ASCII格式文本编码。其中我们常用的一般为第1,2,3,4类数据。第一类数据格式:用于地面填图,第二类数据格式:用于高空填图,第三类数据格式:用于通用填图和离散点等值线,第四类数据格式:用于格点等值线。

micaps1类数据的读取和普通文本文件没有什么两样。前两行分别是“diamond 1 屏幕上需显示的内容”和“ 年 月 日 时次 总站点数”。后面就是具体的数据信息。需要注意的就是有的第一类数据是一个站点的数据分成两行进行存储的,读取的时候需要两行放在一起读,如果使用importdata的话会造成读取出现错误。推荐首先对前两行单独读取,提取其中有用信息,并且用总站点数对资料完整度进行检验,后面使用fscanf进行读取,每次读取两行。

micaps2类数据的读取和1类数据基本类似。所不同的是每个站点只有一行,但是所有资料都是按等压面压强归类,被分别存储到以压强为名字的文件夹下面。例如100,300,500,700,850等。读取数据之后,需要自行根据需要进行整合。

micaps3类数据的读取和2类数据基本类似。但是其前面有关于绘图的一系列参数,对于只需要数据的我们并不需要,在读取的过程中可以将其跳过不读。下面的数据格式就相当简单了,分别是“”经度 纬度 拔海高度 量值“,无论是importdata还是fscanf都能够轻而易举的读取,在此不再赘述。

micaps4类数据存储的是格点数据。其前两行的内容分别是“diamond 4 屏幕上需显示的内容”和“ 年 月 日 时次 时效 层次”。第三行的信息是“经度格距 纬度格距 起始经度 终止经度 起始纬度 终止纬度 X-DIM Y-DIM 等值线间隔 等值线起始值 终止值 平滑系数 加粗线值”。从第四行开始,就是格点数值了。这些数据的读取就是一个大的矩阵了。至于其中每个数值代表的地点,通过第三行的描述就能将其解析出来。

micaps数据的读取,我给出过一个简单的小程序(C++和matlab的都有,一些在matlab出现的错误,c++里面没有)。