matlab文本文件操作

本文详细介绍了在MATLAB环境下如何操作文本文件,包括文本文件的导入导出、使用importdata、dlmread、textscan、fscanf等功能函数,以及fprintf和diary函数的使用,同时探讨了不同函数在处理文本数据时的优缺点和注意事项。
摘要由CSDN通过智能技术生成

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 函数实现数据的导入。

  1. 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 中。
    • 问题:该函数的读取结果还存在一定问题有待进一步研究。
  2. 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’);
```

- 问题:往往我们需要处理的数据都是含有标题或者,说格式比较特别的,以上两个函数,只能适用与简单情形。
  1. 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 参数。

参数 含义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半美人

动力源于鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值