进行数据存取的技巧总结相当的经典.docx

上传人:b****2 文档编号:2867472 上传时间:2023-05-04 格式:DOCX 页数:17 大小:25.96KB
下载 相关 举报
进行数据存取的技巧总结相当的经典.docx_第1页
第1页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第2页
第2页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第3页
第3页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第4页
第4页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第5页
第5页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第6页
第6页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第7页
第7页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第8页
第8页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第9页
第9页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第10页
第10页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第11页
第11页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第12页
第12页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第13页
第13页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第14页
第14页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第15页
第15页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第16页
第16页 / 共17页
进行数据存取的技巧总结相当的经典.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

进行数据存取的技巧总结相当的经典.docx

《进行数据存取的技巧总结相当的经典.docx》由会员分享,可在线阅读,更多相关《进行数据存取的技巧总结相当的经典.docx(17页珍藏版)》请在冰点文库上搜索。

进行数据存取的技巧总结相当的经典.docx

进行数据存取的技巧总结相当的经典

使用文本文件(.txt)进行数据存取

技巧总结(相当的经典)

由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原作者略去,在此对所有原作者表示感谢!

特别说明:

由于大家在I/O存取上以txt文件为主,且读取比存储更麻烦(存储的话fwrite,fprintf基本够用),因此下面的讨论主要集中在“txt文件的读取”上。

除了标注了“转”之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。

一.基本知识:

---------------------------------------转----------------------------------

1.二进制文件与文本文件的区别:

将文件看作是由一个一个字节(byte)组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。

这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?

其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。

如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。

譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。

从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种:

ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。

例如,数5678的存储形式为:

  

  ASCII码:

 00110101  00110110  00110111  00111000  

     ↓    ↓   ↓     ↓

  十进制码:

5     6   7      8  

共占用4个字节。

ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。

由于是按字符显示,因此能读懂文件内容。

二进制文件是按二进制的编码方式来存放文件的。

例如,数5678的存储形式为:

00010110  00101110只占二个字节。

二进制文件虽然也可在屏幕上显示,但其内容无法读懂。

C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。

输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。

因此也把这种文件称作“流式文件”。

  

2.文本模式(textmode)和二进制模式(binarymode)有什么区别?

  

流可以分为两种类型:

文本流和二进制流。

文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“\n”,(如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n")。

二进制流是非解释性的,一次处理一个字符,并且不转换字符。

注:

  

    \n一般会操作系统被翻译成"行的结束",即LF(Line-Feed)

    \r会被翻译成"回车",即CR(Cariage-Return)

    对于文本文件的新行,在UNIX上,一般用\n(LF)来表示,Mac上用\r(CR)来表示,

    Windows上是用\n\r(CR-LF)来表示。

      

      

  通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如图形或字处理文档),或者读取鼠标输入,或者读写调制解调器。

如果用文本方式打开二进制文件,会把“0D  0A”自动变换成“\n”来存在内存中。

写入的时候反向处理。

而二进制方式打开的话,就不会有这个过程。

但是,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中可用来读写各种文件格式的完全函数列表,可以键入以下命令:

helpiofun

MATLAB中有两种文件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

907876

598123

Example:

用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-ascii

UIGETFILE/UIPUTFILE

UIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。

会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。

UIGETFILE让你选择一个文件来写(类似Windows‘另存为’选项?

)。

用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。

两个函数的返回值是所选文件名和路径。

Example:

用UIGETFILE从当前目录选择一个M-file

CODE:

%ThiscommandlistsalltheM-filesinthecurrentdirectoryand

%returnsthenameandpathoftheselectedfile

[fname,pname]=uigetfile('*.m','SampleDialogBox')

注意:

UIGETFILE一次只能选择一个文件。

UIIMPORT/IMPORTDATA

UIIMPORT是一个功能强大,易于使用的基于GUI的highlevelroutine,用于读complexdatafiles。

文件也必须是homogeneous。

IMPORTDATA形成UIIMPORT的功能,不打开GUI。

可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。

下面的例子用到包含几行文件头和文本、数值数据的文件'sample_file2.txt':

Thisisafileheader.

Thisisfileisanexample.

col1col2col3col4

A  1  4  612.000

B  1  4  613.000

C  1  4  614.000

D  1  4  615.000

Example:

UsingIMPORTDATAtoreadinafilewithheaders,text,andnumericdata

CODE:

%Thisreadsinthefile'sample_file2.txt'andcreatesa

%structureDthatcontainsbothdataandtextdata.

%NotetheIMPORTDATAcommandspecifiesawhitespace

%asthedelimiterofthefile,butIMPORTDATAcanusually

%detectthisonitsown

D=importdata('sample_file2.txt','')  %原文有误?

D=importdata('sample_file2.txt')

可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入:

data=D.data

text=D.textdata

可以用UIIMPORT读同一个文件并得到同样的结构.

注意:

对于ASCIIdata,你必须检验导入向导正确的识别了列分隔符。

TEXTREAD/STRREAD

TEXTREAD是一个强大的动态highlevelroutine,设计用来读ASCII格式的文本和/或数值数据文件。

STRREAD除是从字符串而不是文件读以外,类似于TEXTREAD。

两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。

他们有效的提供给你一个

“两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(highlevelroutines的做法),并且你可以改变他们以匹配你特定的应用(如同lowlevelroutines做到的)。

例子:

CODE:

Example1:

UsingTEXTREADtoreadinanentirefileintoacellarray

%Thiscommandreadsinthefilefft.mintothecellarray,file

file=textread('fft.m','%s','delimiter','\n','whitespace','');

CODE:

Example2:

UsingSTRREADtoreadthewordsinaline

%ThiscommandusesthecellarraycreatedinExample1to

%readineachwordofline28in'file'toacellarray,words

words=strread(file{28},'%s','delimiter','')

CODE:

Example3:

UsingTEXTREADtoreadintextandnumericdatafromafilewithheaders

%Thiscommandskipsthe2headerlinesatthetopofthefile

%andreadsineachcolumntothe4specifiedoutputs

[c1c2c3c4]=textread('sample_file2.txt','%s%s%s%s','headerlines',2)

CODE:

Example4:

UsingTEXTREADtoreadinspecificrowsoftextandnumericdatafromafile

%ThiscommandreadsinrowsBandCofthefile.The'headerlines'

%propertyisusedtomovedowntothedesiredstartingrowandthe

%readoperationisperformed2times

[c1c2c3c4]=textread('sample_file2.txt',...

'%s%s%s%s',2,'headerlines',4)

CODE:

Example5:

UsingTEXTREADtoreadinonlythenumericdatafromafilecontainingtextandnumbers

%Thiscommandreadsinonlythenumericdatainthefile.The

%'headerlines'propertyisusedtomovedowntothefirstrow

%ofinterestandthefirstcolumnoftextisignoredwiththe

%'*'  operator

[c2c3c4]=textread('sample_file2.txt','%*s%d%d%f','headerlines',3)

DLMREAD/DLMWRITE/CSVREAD

DLMREAD和DLMWRITE函数能够读写分隔的ASCIIdata,而不是用lowlevelroutines。

他们比lowlevelroutines容易使用,Lowlevelroutines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。

CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。

当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。

以'sample_file.txt'为例:

CODE:

Example1:

UsingDLMREADtoreadinafilewithheaders,text,andnumericdata

%Thisreadsinthefile'sample_file2.txt'andcreatesamatrix,D,

%withthenumericdatathiscommandspecifiesawhitespaceasthe

%delimiterofthefile

D=dlmread('sample_file.txt','')

CODE:

Example2:

UsingDLMREADtoextractthefirst3columnsofthelast3rows

%Thisreadsinthefirst3columnsofthelast3rowsof

%thedatafile'sample_file.txt'intothematrix,D_partial.

%读文件'sample_file.txt'前3列后3行,到矩阵D_partial.

D_partial=dlmread('sample_file.txt','',[2042])

CODE:

Example3:

UsingDLMWRITEtowriteacommadelimitedfile

%Thiscreatesafilecalled'partialD.txt'thatconsistsof

%thefirst3columnsofthelast3rowsofdatawhereeach

%elementisseparatedbyacomma

dlmwrite('partialD.txt',D_partial,',')

注意:

保证DLMREADandDLMWRITE指定范围的指标从0开始,而不是从1开始。

WK1READ/WK1WRITE

WK1READ用来读Lotus123电子数据表文件的数据;WK1WRITE用来写矩阵到Lotus123电子数据表文件。

XLSREAD

XLSREAD用来读Excel的数值和文本数据。

-----------------------------------------------------------------------------------

三.具体例子分析:

Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?

以下结合几个示例给出一些总结,大家举一反三就可以了:

1.纯数据(列数相同):

源文件:

CODE:

03866.1622198.938141.140

13741.1392208.475141.252

23866.2002198.936141.156

33678.0482199.191141.230

43685.4532213.726141.261

53728.7692212.433141.277

63738.7852214.381141.256

73728.7592214.261141.228

83748.8862214.299141.243

93748.9352212.417141.253

103733.6122226.653141.236

113733.5832229.248141.223

123729.2292229.118141.186

解答:

对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。

2.字段名(中、英文字段均可)+数据:

源文件:

CODE:

CH0CH1CH2CH3

0.0001230.0003250.0003780.000598

0.0009860.0002560.0002450.000698

解答:

由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上Inf或NaN),故直接使用importdata便可。

3.注释(含有独立的数字串)+数据(列数相同):

问题:

这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件

源文件:

CODE:

Group2  12.02.2006  Limei

Samplesofdatas:

50000

CH0  CH1  CH2  CH3

0.000123  0.000325  0.000378  0.000598

0.000986  0.000256  0.000245  0.000698

目标文件:

CODE:

Group212.02.2006Limei

Samplesofdatas:

50000

CH0CH1

0.0001230.000325

0.0009860.000256

解答:

由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata,load等高级命令直接读取会失败,用textread,dlmwrite等格式化命令也不太合适,因此只能使用低级命令进行读取。

(当然了,可以跳过注释部分直接用高级命令读取数据,即:

[abcd]=textread(filename,'%f%f%f%f','headerlines',4);)。

一个简单的、非通用的包含注释的读取方法如下:

--------------------------------------转----------------------------------------

CODE:

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,'%s%

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2