MATLAB对于文本文件(txt)数据读取的技巧总结(经典中的经典)

动论坛原版主eight的经典贴http://www.chinavib.com/thread-45622-1-1.html
MATLAB对于文本文件(txt)进行数据读取的技巧总结(经典中的经典)由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用--------标注,原作者略去,在此对所有原作者表示感谢!

特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。

. 基本知识:
------------------------------------------------------------------------------------------------------
1. 二进制文件与文本文件的区别:
将文件看作是由一个一个字节(byte) 组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的01,但是打开方式不同,对于这些01的处理也就不同。如果按照文本方式打开,在打开的时候会进行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等工具打开。

. MatlabI/O文件操作使用技巧和总结:

1. Matlab 支持的I/O文件(对应“取/存”操作)类型:(所有文件I/O程序不需要特殊的工具箱)
http://www.mathworks.com/support/tech-notes/1100/1102.html

(注:从上表可以看到,matlab不支持doc格式的文档存取(因为doc文档包含很多格式控制符),请改用txt或者dat格式)

2. Matlab I/O文件指南:
http://www.mathworks.com/support/tech-notes/1600/1602.html


以下是部分对应的中文译文:
--------------------------------------------------------------
----------------------------------------
本技术支持指南主要处理:ASCII, binary, and MAT files.
要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令:
help iofun

MATLAB中有两种文件I/O程序:high level and low level.
High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。
Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。



High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。


举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以调用一些low level routines自己写一个函数,或者是简单的用TEXTREAD函数。


使用high level routines的关键是:文件必须是相似的(homogeneous),换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。


  • 16
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab,可以使用`textread`或`importdata`函数来从txt文件读取数据。 下面是使用`textread`函数的示例代码: ```matlab % 读取txt文件数据 filename = 'data.txt'; % txt文件名 delimiterIn = ' '; % 分隔符 headerlinesIn = 1; % 文件头行数 A = textread(filename, '%f', 'delimiter', delimiterIn, 'headerlines', headerlinesIn); % 将数据存储在变量 x = A(1:2:end); % 奇数行数据存储在x y = A(2:2:end); % 偶数行数据存储在y ``` 上述代码,`filename` 变量存储了要读取数据txt文件名,`delimiterIn` 变量指定了数据之间的分隔符(默认是空格),`headerlinesIn` 变量指定了文件头的行数。`textread`函数将txt文件数据读取为一个列向量,然后将奇数行的数据存储在 `x` ,偶数行的数据存储在 `y` 。 下面是使用`importdata`函数的示例代码: ```matlab % 读取txt文件数据 filename = 'data.txt'; % txt文件名 A = importdata(filename); % 将数据存储在变量 x = A.data(1:2:end,1); % 奇数行数据存储在x y = A.data(2:2:end,1); % 偶数行数据存储在y ``` 与`textread`函数不同,`importdata`函数可以直接将txt文件数据读取为一个结构体,其包含了文件头和数据。上述代码,`filename` 变量存储了要读取数据txt文件名。`importdata`函数将txt文件数据读取为一个结构体 `A`,结构体的 `data` 字段包含了文件数据。然后将奇数行的数据存储在 `x` ,偶数行的数据存储在 `y`

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值