matlab 环境下操作文本文件
文本文件简介
众所周知,计算机中所有的信息是以二进制的方式存在。而计算机中的文件主要以两种方式存在,即二进制文件和文本文件。
文本文件有字符组成而字符由相应的编码确定的二进制数据表示,因此文本文件也可以看成是一种特殊的二进制文件。
二进制数据与字符之间的映射关系就是所谓的编码。看一个 matlab 中的简单例子。代码如下:
fid = fopen('test.txt','w');
fprintf(fid,'%s','matlab 如何处理中文字符');
fclose(fid);
运行代码可以看到成功生成了 text.txt 文件。我们以 16 进制格式打开文件。看到如下数值:
Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: 6D 61 74 6C 61 62 20 C8 E7 BA CE B4 A6 C0 ED D6 matlab.Hg:N4&@mV
00000010: D0 CE C4 D7 D6 B7 FB PNDWV7{
查询相应的 ASCII 码表有:
值 | 0x6D | 0x61 | 0x74 | 0x6c | 0x61 | 0x62 |
---|---|---|---|---|---|---|
字符 | ‘m’ | ‘a’ | ‘t’ | ‘l’ | ‘a’ | ‘b’ |
text 文本文件存储单字节字符时使用的是 ASCII 码。而存储8个汉字共用了 16 字节,也即汉字储存是采用两个字节。
文本文件的缺点就在于,存储同样信息,要比二进制文件占用更大的空间。而优点在于,使用灵活并且有成熟的编码标准,可以在 Unix、Macintosh、Windows、Dos 等系统中自由切换。 c语言的源代码,matlab 中的 m 文件等都是文本文件。
文本数据的导入
利用 GUI 界面的导入方式就不再赘述了。这里重点研究如何利用 matlab 函数实现数据的导入。
-
importdata 函数。该函数我非常喜欢因为,会自动根据文件的拓展名自动判断文件类型,调用不同模块。需要注意的是如果要导入的文本文件非常大且复杂,该函数读入可能不全,我之前就遇到过这种情况。当然也有可能是我的问题,但是应当小心谨慎。 此外与其他函数相比,该函数效率较低。
- 调用方式:
- a = importdata(filename)
- a = importdata(’-pastespecial’)
- a = importdata(_,delimiterIn);
- a = importdata(_,delimiterIn,headerlinesIn);
- [a,delimiterOut,headerlineOut] = importdata(_);
- 参数解释:
- filename:所导入文件的名称。如果 filename 为相对路径时,即只有文件名称是应当在当前目录下,否则应为绝对路径。
- ‘-pastespecial’:表示从剪贴板导入数据。
- delimiterIn:定义列与列之间的分隔符类型。在文本文件中,数据元素与数据元素或文本块之间需要使用分隔符进行区别。**跳格键在 matlab 中应表示为 ‘\t’ **
- headerlinesIn:定义文本文件标题行的行数。importdata 函数会将标题行的所有内容以字符串的形式存放到 textdata 中。
- 问题:该函数的读取结果还存在一定问题有待进一步研究。
- 调用方式:
-
dlmread 函数导入数值数据。
- 调用方式:
- n = dlmread(filename)
- n = dlmread(filename,delimiter)
- n = dlmread(filename,delimiter,R,C)
- n = dlmread(filename,delimiter,range)
- 参数解释:
- R,C 是开始读取的行和列。
- range 是读取的范围,有两种方式。
- [R1 C1 R2 C2] 指定表格的左上角和右下角。
- ‘A1…D3’ 电子表格形式。
- 注意:这里的行和列都是以 0 起算,即第一行为 0,第一列为 0。
- 实例代码:
data1 = dlmread('rand.txt');
- 调用方式:
% 读取指定范围
data2 = dlmread(‘rand.txt’,’ ‘,3,3);
%
data3 = dlmread(‘rand.txt’,’ ‘,[ 1 2 3 3]);
%
data4 = dlmread(‘rand.txt’,’ ',‘C2…D4’);
```
- 问题:往往我们需要处理的数据都是含有标题或者,说格式比较特别的,以上两个函数,只能适用与简单情形。
- textscan 函数实现格式化读入较复杂的数据。
- 调用方式:
- c = textscan(fid,format)
- c = textscan(fid,format,N)
- c = textscan(fid,format,param,value)
- c = textscan(fid,format,N,param,value)
- c = textscan(str,…)
- [ c , position] = textscan(…)
- 参数解释:
- format 字符型,表示读取文本数据时采用的格式转换符。
- N:表示 format 执行的次数。默认情况下,textscan 函数以最大次数执行 format 格式转换符,直到文件末尾或字符串结尾;
- fid:为 fopen 函数的返回值,可以理解为文件的标识。
- str:为字符串,也即 textscan 函数可以直接从字符串中读入数据。
- 输出参数 position: 含义比较特殊,对于文件而言,可以视为 textscan 函数执行完后文件指针的位置。即,position = ftell(fid);对于字符串而言,为 textscan 函数读取字符的个数。
- format 参数的重点论述:format 为读取数据时所采用的格式转换符,由一个或多个由百分号 % 引导的格式转换符组成。
- textscan 函数的基本转换符表:
- 调用方式:
类型 | 转换符 | 含义 |
有符号整型 |
%d | 32位整型 |
%d8 | 8位整型 | |
%d16 | 16位整型 | |
%d32 | 32位整型 | |
%d64 | 64位整型 | |
无符号整型 |
%u | 32位整型 |
%u8 | 8位整型 | |
%u16 | 16位整型 | |
%u32 | 32位整型 | |
%u64 | 64位整型 | |
浮点型 |
%f | 64位浮点型 |
%f32 | 32位浮点型 | |
%f64 | 64位浮点型 | |
%n | 64位浮点型 | |
字符型 |
%s | 字符串 |
%q | 字符串 | |
%c | 单一字符串 |
**%s 和 %q 的区别是:如果使用双引号将若干字符串包含起来,那么 %s 将双引号看作是一个普通字符,而 %q 则将双引号中的所有内容读入,而把双引号抛弃(此处的双引号是特指英文双引号**
- 实例代码:
```matlab
close all
clc
%%生成测试文件
fid = fopen('hello.txt','w');
fprintf(fid,'"hello,world"');
fclose(fid);
%%
clear
fid = fopen('hello.txt','r');
% 将文件指针移动到文件初始处
fseek(fid,0,'bof');
s1 = textscan(fid,'%s');
fseek(fid,0,'bof');
s2 = textscan(fid,' %q ',1);
fclose(fid);
```
- 结果:
- 格式控制中的辅助符号
- 字段长度控制:在类型符前添加正整数。表示读取 n 个字符或数字。如果是读取数字,小数点也计算长度。读到分隔符时停止,比如利用 %8s 读取 “hello world”,读取结果为 hello,因为空格为分隔符。
%N.Dn 或 %N.Df 控制读入浮点型数字的整数和小数部分。
- 实例代码:
```matlab
clear
close all
clc
%%生成测试文件
fid = fopen('number.txt','w');
fprintf(fid,'824.24245 abd');
fclose(fid);
%%
clear
fid = fopen('number.txt','r');
s1 = textscan(fid,'%6.1f',1);
s2 = textscan(fid,'%s',1);
fseek(fid,0,'bof');
s3 = textscan(fid,'%10.3f',1);
s4 = textscan(fid,'%s',1);
fseek(fid,0,'bof');
s5 = textscan(fid,'%20.20f',1);
s6 = textscan(fid,'%s',1);
fclose(fid);
```
- 结果:
至于结果请慢慢研究。
- 忽略字段或字符。
在读取文本数据时,如果在格式符前添加 * 号则会忽略该格式符所匹配的字符段。如用 "%s %*s %s"读取,"red green blue",时得到red green。、
读取文本数据时,在格式符前出现的非格式符会被忽略。如,使用"pi = %f",读取文本pi = 3.14,textscan 会忽略 pi 而得到 3.14
- 实例代码:
```matlab
close all
clc
%%生成测试文件
fid = fopen('number.txt','w');
fprintf(fid,'a,b,c\nd,e,f\ng,h,i');
fclose(fid);
%%
clear
fid = fopen('number.txt','r');
s1 = textscan(fid,'%s %*s %s',2,'delimiter',',');
fclose(fid);
s1{:}
```
- 结果:
- textscan 函数中的 param 和 value 参数。
参数 | 含义 |
---|