1、load&save方法(大规模、规律数据)
(1)读取文件(路径无需引号):
- 文本文件:load 文件路径.txt (-ascii),按文件原有规则格式分隔获得double类型矩阵,不过字符并不会读取(它仅读取数值)。
- “文件”类型:load 文件路径(无后缀)。
- .mat文件:load 文件路径(无需后缀,.mat为默方式)。
(2)保存文件(路径无需引号):
- 文本文件:save 文件路径.txt 数据变量 –ascii(必须),若文件路径不带.txt,则获得“文件类型(二进制)”文件;保存方式趋于数值。
- 文件”类型:save 文件路径 数据变量 –ascii,这也是一种二进制文件。
- .mat文件:save 文件路径(无需.mat,默认格式) 数据变量。
注:load读取时,文件数据的排列类似矩阵或者表格形式(每行等长)!!!
2、大批量文本数据专属读法:textread&textscan
textread不用fopen目标文件,适用于格式相对统一的txt文件(行可不等长)的一次性大批量读取。textread读取某个文件后,下次再用读取这个文件时,还是会从文件头开始读取。textscan与textread相似,不同处在于:textscan需要fopen获取文件句柄、且结果仅为一个cell矩阵。使用这两者应注意:
- 控制字符串书写原则:出现不读、匹配须对。即在控制字符串中出现的则结果中不会出现,匹配一定要“见啥匹配啥”(如不能用%s配数值,不同于C)。
- 文件名需加上.txt,且需引号‘’引起来。文件每行可以不等长(用0补位),这点不同于load函数。
- 格式控制字符之间可空格、紧挨,也可以是“,”,甚至是“;”等等。按“出现不读”原则书写即可。控制符之后加N可控制只读取文件前N行。
- 自定义分割符:'delimiter’,[‘ ,’,’ ;’,…](分隔符可以自定义,仅空格可自动识别)。
- 过滤标题行:’headerlines’ ,n,去掉初始的n行标题。
- 跳过某个单词:在其对应控制符中加上*,如%*d(使用textread时,所跳单词对应的储存变量也应删去;使用textscan则自适应)。
- 取单词的一部分:满足“出现不读”原则。控制符设置为“yx%c”,即只取了yxy中的后一个y。
- 替换文件中的空位:‘emptyvalue’, 替换值。
- 只读前几列或者指定的列:’%s%*[\n]’(前一列);’%*s%[\n]’(跳过第一列,结果仅为n×1的cell)
- 如文本行Lobith;1989-01-01;00:00;28.01,使用textread且控制字符可取:①’%s%d-%d-%d %d:%d%f’,’delimiter’,’;’,或者②’%s;%d-%d-%d;%d:%d;%f’。两种都将数值部分读取成double矩阵(共6个),即满足“出现不读,匹配须对”原则。
3、文本文件的“行字符串”读取
line=fgetl(fid)/line=fgets(fid,nchar)将文本文件的每一行视为一个“字符串”,然后逐行读取! **前者** 所读的每行字符串中不包括换行符,而 **后者** 保留了换行符;读取完毕至文件末尾时,line=-1!设计了一个读取整个文本的函数如下:
function textData= ReadAllLines(fid) %fid文件句柄
textData={};
Line=fgetl(fid);
while ischar(Line) %读到文件末尾时,fgetl返回-1
textData=cat(1,textData,Line); %垂直连接
Line=fgetl(fid);
end
fclose(fid);
end
4、低级文件I/O操作(灵活自如)
基本过程为:fid=fopen(‘path’,‘读写类型’)打开→fscanf/fread读取→fprintf/ fwr ite写入→fclose(fid)关闭
(1)文本文件:
fid=fopen(‘path.txt’,’~t’)→ .txt必须加上、t文本时加上(如rt)。
[A,count]=fscanf(fid,format,size)→ A为读取结果;count读取个数;format数据格式(如:%d/%f/%g/%s等);size决定A的排列方式(整个文件:省略/inf、N:读取N个元素到列向量、[m,n]:读取数据到m×n矩阵,n=inf时表示A仅为m行)。
[count,errmsg]=fprintf(fid,format,A)→ count为成功写入字节数;errmsg错误信息;format为数据格式,与fscanf相同,还可加上转义字符\n等;A为待写数据。
fclose(fid)→ 关闭文件。
(2)二进制文件:
fid=fopen(‘path’ ,’~’)→可加上文件后缀,不加则为默认的二进制。
[A,count]=fscanf(fid,size,precision,skip)→ A为读取结果;count读取个数;precision数据类型(如:uchar(默认)/int32/float32/double等);size决定A的排列方式(整个文件:省略/inf、N:读取N个元素到列向量、[m,n]:读取数据到m×n矩阵,n=inf时表示A仅为2列)。skip周期性跳过一些数(默认:字节单位;若果有precision则它定义)。
count=fwrite(fid,A,precision)→count成功写入个数;其他同上。
fclose(fid)→关闭文件。
(3)读取示例:
文件内容如下(共672行):
读取代码:
clc;clear;
fid=fopen('f:\data1.txt','rt');
A=(fscanf(fid,'%d-%d-%d,%f:%f,%f',[6,inf]))'; %转置为6列的A(读取时:出现不读)
fclose(fid);
fd=fopen('f:\Pdata1.txt','wt');
fprintf(fd,'%d-%d-%2d,%2d:%d,%f\n',A'); %按列输出(输出时:出现则输)
fclose(fd);
祝您学习进步!(*^▽^*)