!本文仅供自己参考,东拼西凑系列
!帮助文档非常香,有需要请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]); %9行31列,给数据转置了
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 数组
1 至 6 列
[31×1 double] [31×1 double] [31×1 double] [31×1 double] [31×1 double] [31×1 double]
7 至 9 列
[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