使用文本文件txt 进行数据存取的技巧总结 相当17页word文档文档格式.docx
《使用文本文件txt 进行数据存取的技巧总结 相当17页word文档文档格式.docx》由会员分享,可在线阅读,更多相关《使用文本文件txt 进行数据存取的技巧总结 相当17页word文档文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
除了标注了"
转"
之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。
一.基本知识:
--转--
1.二进制文件与文本文件的区别:
将文件看作是由一个一个字节(byte)组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。
这就是两者的区别;
接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?
其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。
如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;
最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。
譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);
而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。
从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种:
ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。
例如,数5678的存储形式为:
ASCII码:
00110101001101100011011100111000
十进制码:
5678
共占用4个字节。
ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。
由于是按字符显示,因此能读懂文件内容。
二进制文件是按二进制的编码方式来存放文件的。
0001011000101110只占二个字节。
二进制文件虽然也可在屏幕上显示,但其内容无法读懂。
C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。
输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。
因此也把这种文件称作"
流式文件"
。
2.文本模式(textmode)和二进制模式(binarymode)有什么区别?
流可以分为两种类型:
文本流和二进制流。
文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符"
\n"
,(如果以"
文本"
方式打开一个文件,那么在读字符的时候,系统会把所有的"
\r\n"
序列转成"
,在写入时把"
转成"
)。
二进制流是非解释性的,一次处理一个字符,并且不转换字符。
注:
\n一般会操作系统被翻译成"
行的结束"
,即LF(Line-Feed)
\r会被翻译成"
回车"
,即CR(Cariage-Return)
对于文本文件的新行,在UNIX上,一般用\n(LF)来表示,Mac上用\r(CR)来表示,
Windows上是用\n\r(CR-LF)来表示。
通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;
而二进制流用来读写二进制文件(例如图形或字处理文档),或者读取鼠标输入,或者读写调制解调器。
如果用文本方式打开二进制文件,会把"
0D0A"
自动变换成"
来存在内存中。
写入的时候反向处理。
而二进制方式打开的话,就不会有这个过程。
但是,Unicode/UTF/UCS格式的文件,必须用二进制方式打开和读写。
上述基础其实大可以略过,简言之,对用户来说:
在matlab中存储成为二进制还是文本文件取决于fopen的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;
如果用w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit等工具打开。
二.Matlab的I/O文件操作使用技巧和总结:
1.Matlab支持的I/O文件(对应"
取/存"
操作)类型:
(所有文件I/O程序不需要特殊的工具箱)
(注:
从上表可以看到,matlab不支持doc格式的文档存取(因为doc文档包含很多格式控制符),请改用txt或者dat格式)
2.Matlab的I/O文件指南:
以下是部分对应的中文译文:
本技术支持指南主要处理:
ASCII,binary,andMATfiles.
要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令:
helpiofunMATLAB中有两种文件I/O程序:
highlevelandlowlevel.
Highlevelroutines:
包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。
Lowlevelroutines:
可以更加灵活的完成相对特殊的任务,需要较多的额外编程。
Highlevelroutines包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。
举个例子,如果你有一个包含数值和字母的文本文件(textfile)想导入MATLAB,你可以调用一些lowlevelroutines自己写一个函数,或者是简单的用TEXTREAD函数。
使用highlevelroutines的关键是:
文件必须是相似的(homogeneous),换句话说,文件必须有一致的格式。
下面的段落描述一些highlevelfileI/Oroutines并给出一些例子帮助理解概念。
LOAD/SAVE
主要的highlevelfileI/Oroutines是LOAD和SAVE函数。
LOAD
可以读MAT-filedata或者用空格间隔的格式相似的ASCIIdata.SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCIIdata。
大多数情况下,语法相当简单。
下面的例子用到数值由空格间隔的ASCIIfilesample_file.txt:
154168
543268
684321
907876598123Example:
用LOADandSAVE读写数据
CODE:
%Loadthefiletothematrix,M:
M=load('
sample_file.txt'
)
%Add5toM:
M=M+5
%SaveMtoa.matfilecalled'
sample_file_plus5.mat'
:
savesample_file_plus5M
%SaveMtoanASCII.txtfilecalled'
sample_file_plus5.txt'
savesample_file_plus5.txtM-asciiUIGETFILE/UIPUTFILEUIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。
会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。
UIGETFILE让你选择一个文件来写(类似Windows'
另存为'
选项?
用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。
两个函数的返回值是所选文件名和路径。
Example:
用UIGETFILE从当前目录选择一个M-fileCODE:
%ThiscommandlistsalltheM-filesinthecurrentdirectoryand
%returnsthenameandpathoftheselectedfile
[fname,pname]=uigetfile('
*.m'
'
SampleDialogBox'
注意:
UIGETFILE一次只能选择一个文件。
UIIMPORT/IMPORTDATAUIIMPORT是一个功能强大,易于使用的基于GUI的highlevelroutine,用于读complexdatafiles。
文件也必须是homogeneous。
IMPORTDATA形成UIIMPORT的功能,不打开GUI。
可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。
下面的例子用到包含几行文件头和文本、数值数据的文件'
sample_file2.txt'
Thisisafileheader.
Thisisfileisanexample.
col1col2col3col4A14612.000B14613.000C14614.000D14615.000Example:
UsingIMPORTDATAtoreadinafilewithheaders,text,andnumericdataCODE:
%Thisreadsinthefile'
andcreatesa
%structureDthatcontainsbothdataandtextdata.
%NotetheIMPORTDATAcommandspecifiesawhitespace
%asthedelimiterofthefile,butIMPORTDATAcanusually
%detectthisonitsownD=importdata('
'
)%原文有误?
D=importdata('
可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入:
data=D.datatext=D.textdata
可以用UIIMPORT读同一个文件并得到同样的结构.
对于ASCIIdata,你必须检验导入向导正确的识别了列分隔符。
TEXTREAD/STRREADTEXTREAD是一个强大的动态highlevelroutine,设计用来读ASCII格式的文本和/或数值数据文件。
STRREAD除是从字符串而不是文件读以外,类似于TEXTREAD。
两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。
他们有效的提供给你一个
"
两全其美"
的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(highlevelroutines的做法),并且你可以改变他们以匹配你特定的应用(如同lowlevelroutines做到的)。
例子:
Example1:
UsingTEXTREADtoreadinanentirefileintoacellarray
%Thiscommandreadsinthefilefft.mintothecellarray,filefile=textread('
fft.m'
%s'
delimiter'
\n'
whitespace'
);
Example2:
UsingSTRREADtoreadthewordsinaline
%ThiscommandusesthecellarraycreatedinExample1to
%readineachwordofline28in'
file'
toacellarray,wordswords=strread(file{28},'
Example3:
UsingTEXTREADtoreadintextandnumericdatafromafilewithheaders
%Thiscommandskipsthe2headerlinesatthetopofthefile
%andreadsineachcolumntothe4specifiedoutputs
[c1c2c3c4]=textread('
%s%s%s%s'
headerlines'
2)
Example4:
UsingTEXTREADtoreadinspecificrowsoftextandnumericdatafromafile
%ThiscommandreadsinrowsBandCofthefile.The'
%propertyisusedtomovedowntothedesiredstartingrowandthe
%readoperationisperformed2times
.
2,'
4)
Example5:
UsingTEXTREADtoreadinonlythenumericdatafromafilecontainingtextandnumbers
%Thiscommandreadsinonlythenumericdatainthefile.The
%'
propertyisusedtomovedowntothefirstrow
%ofinterestandthefirstcolumnoftextisignoredwiththe
*'
operator
[c2c3c4]=textread('
%*s%d%d%f'
3)
DLMREAD/DLMWRITE/CSVREADDLMREAD和DLMWRITE函数能够读写分隔的ASCIIdata,而不是用lowlevelroutines。
他们比lowlevelroutines容易使用,Lowlevelroutines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。
CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。
当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。
以'
为例:
UsingDLMREADtoreadinafilewithheaders,text,andnumericdata
andcreatesamatrix,D,
%withthenumericdatathiscommandspecifiesawhitespaceasthe
%delimiterofthefileD=dlmread('
UsingDLMREADtoextractthefirst3columnsofthelast3rows
%Thisreadsinthefirst3columnsofthelast3rowsof
%thedatafile'
intothematrix,D_partial.
%读文件'
前3列后3行,到矩阵D_partial.
D_partial=dlmread('
[2042])
UsingDLMWRITEtowriteacommadelimitedfile
%Thiscreatesafilecalled'
partialD.txt'
thatconsistsof
%thefirst3columnsofthelast3rowsofdatawhereeach
%elementisseparatedbyacommadlmwrite('
D_partial,'
保证DLMREADandDLMWRITE指定范围的指标从0开始,而不是从1开始。
WK1READ/WK1WRITEWK1READ用来读Lotus123电子数据表文件的数据;
WK1WRITE用来写矩阵到Lotus123电子数据表文件。
XLSREADXLSREAD用来读Excel的数值和文本数据。
三.具体例子分析:
Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?
以下结合几个示例给出一些总结,大家举一反三就可以了:
1.纯数据(列数相同):
源文件:
03866.1622198.938141.14013741.1392208.475141.25223866.2002198.936141.15633678.0482199.191141.23043685.4532213.726141.26153728.7692212.433141.27763738.7852214.381141.25673728.7592214.261141.22883748.8862214.299141.24393748.9352212.417141.253103733.6122226.653141.236113733.5832229.248141.223123729.2292229.118141.186
解答:
对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。
2.字段名(中、英文字段均可)+数据:
CH0CH1CH2CH30.0001230.0003250.0003780.0005980.0009860.0002560.0002450.000698
由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上Inf或NaN),故直接使用importdata便可。
3.注释(含有独立的数字串)+数据(列数相同):
问题:
这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件
Group212.02.2019LimeiSamplesofdatas:
50000CH0CH1CH2CH30.0001230.0003250.0003780.0005980.0009860.0002560.0002450.000698
目标文件:
50000CH0CH10.0001230.0003250.0009860.000256
由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata,load等高级命令直接读取会失败,用textread,dlmwrite等格式化命令也不太合适,因此只能使用低级命令进行读取。
(当然了,可以跳过注释部分直接用高级命令读取数据,即:
[abcd]=textread(filename,'
%f%f%f%f'
4);
一个简单的、非通用的包含注释的读取方法如下:
---转---
clc;
clear;
fid=fopen('
exp.txt'
r'
fid_n=fopen('
ex.dat'
w'
while~feof(fid)
tline=fgetl(fid);
if~isempty(tline)
ifdouble(tline
(1))=48&
&
double(tline
(1))=57%数值开始
a=strread(tline);
a(3:
4)=;
fprintf(fid_n,'
%f%f\n'
a);
cleara;
elseifdouble(tline
(1))==67%字母C开始
[b1,b2,b3,b4]=strread(tline,'
b=[b1{1},'
b2{1}];
%s\n'
b);
clearbb1b2b3b4;
elsefprintf(fid_n,'
tline);
endelsefprintf(fid_n,'
endendfclose(fid);
fclose(fid_n);
4.注释(不含独立的数字串)+数据(列数相同):
你好abc
欢迎来到我们
振动论坛
vib.hit.edu111111111122222222