RM-2 使用matlab进行txt文件读写

!本文仅供自己参考,东拼西凑系列
帮助文档非常香,有需要请help(’???’)一下
%f:浮点数(默认为双精度%f64,%f32),%d:有符号整形,%u:无符号整型,%s:字符串,%c:字符;\t:制表符

二、使用matlab对txt进行读写

使用Matlab读取txt文件时,常用函数有:

  • 高阶函数:load; importdata; dlmread; textread; strread.
  • 低阶函数:fopen; fclose; fgets; fgetl; fscanf; textscan.

其中,低阶函数调用语法比较复杂,但是能按照各种格式读取文件,具有一定的灵活性。高阶函数的调用语法简单,但是只适用于某些特殊格式的文件类型,缺乏灵活性。

(一)利用数据导入导向导入txt

方法1. 主页>>导入数据>>文件选择
方法2. 在命令窗口输入:

>> uiimport
#最终变量名与文件名相同
#缺点是:只能导入排列较为整齐的数据,无法导入字符串
#当各列数据数量不同时,使用NaN自动补全

(二)high level(2例题待补

指定数据文件时,应指定文件完整路径;否则,应将文件至于matlab搜索路径下。

1.importdata

A = importdata(‘filename’)
[A D H] = importdata(‘filename’)
[……] = importdata(’-pastespecial’)
这种调用自动识别数据间分隔符,将读取的数据赋给变量A。
其中A是结构体数组,A.data是数值型数据,A.textdata是文本数据
D是“返回的分隔符”,H是“返回的头文件行数”

将下文中的【例-001】导入后,此时读取的中文title均为乱码
故在调用importdata函数前,打上

feature('DefaultCharacterSet', 'UTF8');  

即可使matlab支持utf-8编码。

让我们来举个txt例子【例001】:

比如txt文件如下:

俺是一个测试文档,这是没啥用的一行。
我是谁 我在干啥 我在做什么 啊啊啊啊!!
0.000123 0.000325 0.000378 0.000598
0.000986 0.000256 0.000245 0.000698 23333333

敲上去的字儿:

clc;clear;
feature('DefaultCharacterSet', 'UTF8'); 
M = importdata('testme.txt')  

出来的结果:

M = 

  包含以下字段的 struct:
          data: [3×4 double]
      textdata: {2×4 cell}
    colheaders: {'我是谁'  '我在干啥'  '我在做什么'  '啊啊啊啊!!'}
#其中,data有3行的原因是23333333被挤到下面了。
#可能是因为第一行数据有几个,这个data矩阵就有几列吧=A=

另外:当数据文件较大时,不要搞str2num这种数据转换,疯狂调用函数hhh

2. load,dlmread,textread

load -ascii filename ——(1)
A = load(‘filename’,’-ascii’) ——(2)
B = dlmread(‘filename’,‘delimiter’,R,C) ——(3)
[c1,c2,c3…] = textread(‘filename’,‘format’,N,‘param’,‘value’,…) ——(4)

(1)是load的命令行方式,自动产生变量(变量名是文件名)

(2)是调用load函数,可自定义变量名

(3)delimiter是‘指定分隔符’,R是‘所读数据的起始行’,C是‘所读数据的起始列’,其中R与C的起始数字都是0,其数字起始方式如C++,从0开始=从1开始。也可以:B = dlmread(‘filename’,‘delimiter’,range),其中range=[R1,C1,R2,C2],表示所读数据的左上角和右下角。
且dlmread只能读取单种分隔符的数据文件,否则会报错(‘ ’,‘colon’,‘semicolon’)

(4)format是数据写入格式,比如%d,%5.2f,%s,%c。(借助 %*? 跳过列,此时等号前的被赋值参数可不写)
N是 重复使用N次由format指定的格式读取数据(即读取N行)
param是一种参数名,比如‘headlines’,‘delimiter’,‘whitespace’(把字符作为空格)
value是param的取值。

!!!其中,load和dlmread只能读数

对于比较大型的数据,dlmread函数用时最短,textread次之
load和importdata用时较长

(例子我以后再写……鸽鸽)

三、Low level

调用低级函数读取数据的步骤:(1)按照指定格式打开文件,(2)获取文件标识符,(3)读取文件内容,(4)关闭文件
1.调用fopen函数打开文件
fid = fopen(‘filename’,‘permission’)

  • ‘fid’是文件标识符。文件打开成功时,fid是正整数;文件打开不成功是为-1。
  • ‘permission’是文件的打开方式(下为2016b版本命令)。
    ‘r’:只读(默认情况);
    ‘w’:写入(原文件内容被清除);
    ‘a’:写入(在原文件内容后续写新内容);
    ‘r+’,‘w+’,‘a+’:读+写;
    ?rb,wb 二进制?

此外,还可以用以下的命令来得到 被打开文件 的信息:
[filename,permission] = fopen(fid)
当filename和permission都是空字符‘ ’时,说明文件打开不成功。

2.控制读写位置

  • fseek函数用来设定文件指针位置:
    status = fseek(fid,offset,origin)
    offset:相对于指定的参考位置移动指针的方向和字节数
    origin:指针的参考位置。
    • ‘bof’ 或 -1:文件的开头;
    • ‘cof’或 0 :当前位置;
    • ‘eof’或1:文件末尾;
  • ftell函数用来获取文件指针位置
    position = ftell(fid)
  • frewind用来移动当前文件指针到文件开头
    frewind(fid)
  • feof用来判断会否到达文件末尾
    eofstat = feof(fid)
    当到达文件末尾时,eofstat = 1,否则为 0。
    通常用判断语句 while ~feof(fid) 来处理数据
  • 用fgets,fgetl函数来读取文件的下一行
    tline = fgets(fid)
    tline = fgetl(fid)
    fgets函数读取文件的一行(包括换行符);
    fgetl不包括换行符
    fgets和fgetl读取了此行中的所有字符(包括空格),所以是读取一整行!!!它不会自动处理分隔符,最后数据以char形式保存。
  • 用textscan函数读取数据(返回一个元胞数组)
    textscan相比textread更加灵活和高效,也是按列读取数据,其调用格式如下(和textread格式差不多):
    C = textscan(fid,‘format’)
    C = textscan(fid,‘format’,N,‘param’,‘value’,…)
    最后用C{i},i=1,2,…,n 来查看元胞数组C每一列的元素。
  • 用fscanf函数读取数据,将数据读入到矩阵中:
    data = fscanf(fid,‘format’,size)
    fscanf的数据读取按列优先,但是存储时却将列存储为行(将数据转置)。
    其中,size是读取的数据个数,比如读取N个、读取到最后inf,读取[m,n]个。其中,读入m*n个数据时,必须指定行数,[inf,3]这样的形式是不可取的!

3.调用fclose函数关闭文件
用fopen函数打开文件操作结束后,应将其关闭,否则会影响其他操作。
status = fclose(fid)
status = fclose(‘all’)
若操作成功,status返回值为0,否则为1。

4.举很多的例子 (并没有)

测试文件【例-002】:

4.倾覆力矩 单位为kN.m 以下地震总倾覆力矩由给定水平力作用下的墙柱剪力求得,只用于比较墙柱倾覆力矩

0.00度地震方向… 层号 塔号 总倾覆力矩 柱倾覆力矩 比例(%) 一般墙倾覆力矩 比例(%) 短墙倾覆力矩 比例(%)
1 1 213085.13 8265.84 3.9 169422.59 79.5 35396.64 16.6
2 1 199156.00 7997.07 4.0 156910.95 78.8 34247.94 17.2
3 1 188795.81 7651.01 4.1 148052.38 78.4 33092.39 17.5
4 1 178577.22 7260.48 4.1 139516.56 78.1 31800.14 17.8
5 1 168552.22 6849.23 4.1 131284.92 77.9 30418.04 18.0
6 1 158758.06 6449.38 4.1 123219.60 77.6 29089.04 18.3
7 1 149215.14 6076.45 4.1 115434.23 77.4 27704.44 18.6
8 1 139938.30 5708.01 4.1 107911.72 77.1 26318.55 18.8
9 1 130933.94 5345.22 4.1 100670.55 76.9 24918.15 19.0
10 1 122201.20 4991.57 4.1 93690.69 76.7 23518.93 19.2
11 1 113733.77 4647.76 4.1 86959.30 76.5 22126.69 19.5
12 1 105522.21 4314.06 4.1 80462.05 76.3 20746.09 19.7
13 1 97556.52 3990.35 4.1 74185.70 76.0 19380.45 19.9
14 1 89828.02 3676.43 4.1 68119.19 75.8 18032.38 20.1
15 1 82329.98 3372.05 4.1 62253.84 75.6 16704.08 20.3
16 1 75057.46 3076.99 4.1 56583.02 75.4 15397.44 20.5
17 1 68006.91 2791.08 4.1 51101.64 75.1 14114.18 20.8
18 1 61176.10 2514.18 4.1 45806.11 74.9 12855.80 21.0
19 1 54564.37 2246.32 4.1 40693.71 74.6 11624.33 21.3
20 1 48173.18 1986.83 4.1 35769.25 74.3 10417.10 21.6
21 1 42007.12 1738.58 4.1 31016.84 73.8 9251.69 22.0
22 1 36075.42 1499.54 4.2 26460.25 73.3 8115.63 22.5
23 1 30393.84 1271.37 4.2 22106.57 72.7 7015.89 23.1
24 1 24987.17 1055.21 4.2 17975.98 71.9 5955.98 23.8
25 1 19891.97 852.67 4.3 14098.44 70.9 4940.86 24.8
26 1 15159.33 665.75 4.4 10517.04 69.4 3976.55 26.2
27 1 10858.05 496.83 4.6 7291.21 67.2 3070.00 28.3
28 1 7078.46 348.44 4.9 4499.94 63.6 2230.08 31.5
29 1 3936.25 223.50 5.7 2252.10 57.2 1460.65 37.1
30 1 1573.12 120.62 7.7 654.07 41.6 798.43 50.8
31 1 200.11 47.35 23.7 152.76 76.3 0.00 0.0

测试代码:
fscanf,textscan,position,frewind,fclose

clc;clear;
feature('DefaultCharacterSet', 'UTF8'); 
fid = fopen('matlabread.txt')
i=1;
while i<=6  %跳过前六行
    i=i+1;
    fgets(fid);
end    
TRY = fscanf(fid,'%f',[9,31]);  %931列,给数据转置了
position1 = ftell(fid);  % 文件读取位置:3108
frewind(fid);            %又回到最初的起点
position2 = ftell(fid);     %0
C = textscan(fid,'%f %f %f %f %f %f %f %f %*f','HeaderLines',6)
C{9}=100*C{8}./C{3};        % 之前%*f跳过了第九列,手动补全一下
C  %输出一下C
status = fclose(fid);       %关文件

输出:

fid =
     7

C =

  1×9 cell 数组

  16[31×1 double]    [31×1 double]    [31×1 double]    [31×1 double]    [31×1 double]    [31×1 double]

  79[31×1 double]    [31×1 double]    [31×1 double]

四、把数据写入TXT

  • 命令语法 save mydata.mat variable –ascii
    函数语法 save(‘mydata.mat’,’variable’,’-ascii’);

  • dlmwrite(‘filename’, M);
    dlmwrite(‘filename’, M,‘D’);
    dlmwrite(‘filename’, M,‘D’,R,C,‘-append’);

    M为指定参数值,D为分隔符;R为M矩阵的开始行,C为开始列;-append是续写内容(若不加append,则会将原内容清除)

  • data = fprintf(fid,format,Z);
    Z是要被写入的参数

    此时要注意fopen的premission情况,w+还是a+(a:append)


本文主要参考内容:

  • https://www.ilovematlab.cn/thread-872-1-1.html
    使用文本文件(.txt)进行数据存取的技巧总结
  • 《MATLAB从零到进阶》P195~P220
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值