如何用matlab处理txt数据中的大量数据

15matlab数据的读入和预处理
上亿文档资料,等你来发现
15matlab数据的读入和预处理
第三讲数据的读入和预处理;在金融研究以及金融理论的实际应用上,大量的金融数;值的估计;期权定价中标的资产收益率的波动率估计等;1.EXCEL数据文件的读取;利用MATLAB提供的函数xlsread可以方便;上证综合指数EXCEL文件;下面以上证综合指数为例,给读者介绍如何使用xls;的输出格式中变成了数值型;综合以上例子,可以在MATLAB命令窗口下输入以;
第三讲 数据的读入和预处理 在金融研究以及金融理论的实际应用上,大量的金融数据是不可或缺的。金融理论提供了丰富的模型,但理论模型的实证检验需要大量的金融数据。金融模型的实际应用也需要大量金融数据来估计或标定其中的参数。比如:资本资产定价模型(CAPM)中β值的估计;期权定价中标的资产收益率的波动率估计等都需要实际数据。MATLAB提供了在主窗口直接输入和利用xlsread、textread、fopen等函数直接读取数据两种方式。在主窗口直接输入数据对于少量数据是合适的,但金融领域的研究者和金融行业的金融理论应用人士经常面临大量的金融数据,利用MATLAB提供的内部函数直接读取数据是非常必要的。由于大部分的金融数据来自各种机构提供的数据库,这些数据库数据的输出大多会支持EXCEL和文本文件的输出格式。因此本节介绍如何利用MATLAB提供的xlsread和textread函数来读取*.xls和*.txt数据文件。1.EXCEL数据文件的读取利用MATLAB提供的函数xlsread可以方便地读取数据文件中的数值型数据,对于EXCEL文件中的字符型变量xlsread将不读取或以NaN(在MATLAB中NaN表示“不是一个数”)表示。其最简单的调用格式为在MATLAB命令窗口输入:x=xlsread('filename'),其中filename为在MATLAB自动搜索文件夹下的EXCEL文件名,文件filename中的数值型数据矩阵赋值给变量x。filename可以不带后缀.xls。 上证综合指数EXCEL文件 下面以上证综合指数为例,给读者介绍如何使用xlsread读取数据。图显示了上证综合指数的EXCEL文件中的部分数据(仅显示了其中前20行的数据),其中EXCEL文件中的第一列为日期,第二列为与第一列日期相应的上证综合指数。由于日期型数据在EXCEL中是可以与数值相互转化的,因而xlsread是可以读取日期型数据的。如果该EXCEL文件位于MATLAB自动搜索文件夹下,比如:D:\matlab\work\index.xls。则在MATLAB命令窗口输入:x=xlsread('index')后得到变量x,x为n行2列的矩阵,第一列为日期,第二列为指数。其中n与该文件中的数据长度一致,如数据包含1000天的上证综合指数,则n为1000。这里注意两点:(1)读出的数据赋值给变量x,x的第一列为日期,但在MATLAB的输出格式中变成了数值型。比如图1.1中的第一个日期在EXCEL表中显示为,如果读者在EXCEL表中将其转换为数值型,则在EXCEL表中显示为33226。因此,在MATLAB读入该文件的时候该日期就变成了数值33226;(2)MATLAB提供了一个数值与表示日期的字符型变量相互转换的函数datenum(将日期转换为数值)和datestr(将数值转换为日期),但这种转换与EXCEL中数值和日期型变量的转换是有差异的。在MATLAB中以日作为起点,将这一天转换为数值1,相应的日就转换为2,而在EXCEL中以日为起点,将这一天转换为1。因此,前面的例子中的数据读入MATLAB,并赋值给变量x后,如果要将日期还原到正确的日期,则在MATLAB命令窗口下输入:x(:,1)=x(:,1)+datenum('30-Dec-1899');即可。当然也可以直接调用MATLAB内部函数x2mdate,在MATLAB命令窗口下输入:x(:,1)=x2mdate(x(:,1))进行转换。综合以上例子,可以在MATLAB命令窗口下输入以下命令得到图1.2。%后面的内容表示对命令的解释和说明。clearx=xlsread('index');%读取EXCEL文件x(:,1)=x(:,1)+datenum('30-Dec-1899');%将日期还原h=%生成空的图形set(h,'color','w');%将图的背景颜色设定为白色plot(x(:,1),x(:,2));%以x的第一列为横轴第二列为纵轴作图datetick('x',23);%将横轴转成日期格式'mm/dd/yyyy'xlabel('Date');%生成横坐标标记title('Shanghai Composite ');%生成图形名称上证综合指数走势初次使用xlsread读取数据文件的读者可能会出现打不开文件的情形。下面就读者可能经常碰到的一些问题做出说明。有些读者在可能MATLAB命令窗口下输入x=xlsread('index');后MATLAB提醒找不到该文件。读者可以在MATLAB中File菜单中选择Set Path进行路径设置,将EXCEL文件index.xls所在的文件夹置于搜索路径之下,然后点击Save进行保存即可。有些读者可能碰到无法读取数据的情形,MATLAB提醒文件不包含有效的EXCEL数据。这时,读者可以将EXCEL文件中说明性的字符,比如:对每一列变量做出说明的某些字符等整行删除即可。比如:在上海大智慧投资咨询公司提供的大智慧平台下载数据得到EXCEL文件数据如图所示,则读取文件时就会出现这样的错误。这时可以将文件中的第一行和第二行直接整行删除就可以了。通常在这样处理后在EXCEL数据中某些列中仍夹杂着一些空格,这时MATLAB读入时将其以NaN代替。也有些读者在MATLAB命令窗口下输入x=xlsread('filename');后出现这样的情形,即得到的变量x的列数比EXCEL文件中数据的列数少,这可能是EXCEL数据文件中的第一列或前面的几列数据为字符型,MATLAB在读入数据时忽略了这些列。 大智慧下载数据 使用xlsread读取数据文件有两个明显的缺点。一是xlsread不能读取字符型变量,因此要读取某些包含字符型变量的文件就不能使用xlsread。另外EXCEL文件中的数据长度是有限定的,EXCEL2000单个工作表的最大行数为65536,每一行最大列数为256列。但有时候要处理的金融数据量会超出这个范围,这时候不得不将数据分拆成几个EXCEL文件后分别用xlsread读取。而MATLAB提供的textread函数可以很好地解决以上两个问题。 2.文本数据文件的读取对于*.txt、*.csv等类型的数据文件,如果知道数据文件中每一列数据的类型,即字符型、数值型等。则可以使用MATLAB提供的textread函数方便地进行读取。对于textread函数的详细了解可以在MATLAB命令窗口下输入help textread或doc textread来了解。下面以位于MATLAB自动搜索文件夹下的上证综合指数数据文件,比如:D:\matlab\work\000001.txt,为例来进行解释如何调用textread。图显示了该文件的部分数据,该数据文件包含7列的数据,分别为时间、开盘价、最高价、最低价、收盘价、成交量和成交额,数据包含了了日到日上证综合指数行情。在MATLAB命令窗口下输入以下命令:[a,b,c,d,e,f,g]=textread('000001.txt','%s%f%f%f%f%f%f','headerlines',1);其中上述命令中的输出变量a,b,c,d,e,f,g分别表示时间、开盘价、最高价、最低价、收盘价、成交量和成交额列向量,a为表示时间的字符型变量。textread函数的输入部分中,'000001.txt'表示文件名;%s表示以字符型方式读入变量;%f表示以浮点数值型方式读入变量;'headerlines',1表示文件的第一行为标题,不需要读入。注意:textread函数的输入部分中'%s%f%f%f%f%f%f'是与输出a,b,c,d,e,f,g一一对应的;另外这里文件名的后缀.txt不能省略,否则MATLAB会给出不能找到该文件的提醒。这个例子有点特殊,第一列的时间数据也可以以浮点数值型方式读入。在MATLAB命令窗口下输入以下命令:[a,b,c,d,e,f,g]=textread('000001.txt','%f%f%f%f%f%f%f','headerlines',1);但这时读出的日期变成了数值。比如:日就变成了数值。 上证综合指数文本数据文件 下面再给出一个读取美国债券市场数据的例子。数据文件名为bonds.txt,部分数据内容如图所示。其中crspid表示债券的CRSP识别码、cusip表示债券的CUSIP代码、name表示债券名称、matdt表示债券到期日、type表示类型、couprt表示票面利率。type和couprt两列的数据分别为整数和浮点数值型变量,其他列的数据全部为字符型变量。 美国债券市场文本数据文件 对于上面bonds.txt的读取可以在MATLAB命令窗口下输入以下命令: [a,b,c,d,e,f]=textread('bonds.txt','%s%s%s%s%u%f','headerlines',1); 其中textread输入部分中的%u表示以整数方式读入。3.数据的预处理在得到数据并成功读入数据后,从严谨的角度来看,还不能直接运用这些数据来做实证分析或参数估计。无论初始的数据来源何处,数据中总是有可能存在这样或那样的错误。比如:股票数据中存在一些异常值,价格序列中出现了负值或异常大的数值;股票数据中的交易日期序列某些地方出现了日期颠倒;数据中的某些部分为NaN;部分数据缺失等。因此,还必须对数据进行剔除错误的预处理。对于大量数据而言,手工进行错误判断和除错是不现实的。然而借助MATLAB强大的计算功能可以有效地对数据进行剔除错误的预处理,但这必须事先给出数据中是否存在错误的判断标准。这些判断标准的提出与对所处理的数据本身的了解是密切相关的,比如:数据代表的实际对象等,判断标准也与数据处理者的经验有关。同时要注意避免在除错的过程中引入新的错误。下面以上证综合指数文本数据文件为例,给出常见的一些除错处理方法。(1)数据读入假定我们只需要时间、开盘价、最高价、最低价、收盘价数据,在MATLAB命令窗口下输入以下命令:[a,b,c,d,e]=textread('000001.txt','%s%f%f%f%f%*f%*f','headerlines',1);其中textread输入部分中的%*f表示忽略该列的数据读入。因此,a、b、c、d、e为分别表示时间、开盘价、最高价、最低价、收盘价的列向量。注意,这里我们字符型方式读入了日期变量a,但这里读入的格式与MATLAB认可的日期格式不同。因此,需要编写一段程序将其转换为正确的MATLAB可以处理的日期数据。为此,在MATLAB命令窗口下输入以下命令:x=strvcat(a);%将cell型数组转换为普通矩阵a=datenum(str2num(x(:,1:4)),str2num(x(:,5:6)),str2num(x(:,7:8)));包含各类专业文献、中学教育、专业论文、文学作品欣赏、各类资格考试、应用写作文书、幼儿教育、小学教育、高等教育、15matlab数据的读入和预处理等内容。 
 数据预处理1剔除异常值及平滑处理_计算机软件及应用_IT/计算机_专业资料。Matlab...读取股市数据,对开盘价的 240 条数据,调用 smoothts 函数进 行平滑处理。 ...  实验名称 编写 Matlab 对数据的读入、处理和写出的程序。 实验目的 1. 通过 ...matlab数据的读入和预处... 7页 免费 3_matlab处理数据 60页 1下载券喜欢...  导入模 板也根据文件中的数据分隔符来对导入的数据进行预处理。 在导入模板中...文件中读取数据,必须使用 MATLAB 数据函数,函数 的选择则是依据文本文件中数据的...  Matlab 数据文件的读写在编写一个程序时,经常需要从外部读入数据,或者将程序 ...(b) 该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅...  Matlab 中 txt 文件的读写操作命令整理 将 txt 文件中的数据按行显示输出内容...导入模 板也根据文件中的数据分隔符来对导入的数据进行预处理。 在导入模板中...  Matlab 应用中常需要实现Matlab 与其他应用程序的数据共享,即需将数据文件读入Matlab 进行有效的数 据处理,然后将Matlab 处理好的数据保存为数据文件,以便其他应用...  Matlab导入数据方法_理学_高等教育_教育专区。一将 excel 数据导入 直接将下面三...处理函数 readprocess function readprocess(file) fid=fopen(file,'rt');%...  matlab中如何读取TXT数据文件_工学_高等教育_教育专区 暂无评价|0人阅读|0次下载|举报文档 matlab中如何读取TXT数据文件_工学_高等教育_教育专区。今天需要做个 ...  在典型的机械设备离线检测与故障诊断中,常常将数据采集与数据处理做成分开的模 ...matlab数据的读入和预处... 7页 免费 编写Matlab对数据的读入... 4页 免费...查看: 4985|回复: 12|关注: 0
新手求教如何将txt文件中的图像数据转换成图像
txt中的数据应该是照片各个像素点的灰度值
如何将txt文件中的图像数据读进MATLAB并转换成图像(文件见附件)
希望各位大虾不吝赐教。
17:00 上传
点击文件名下载附件
21.48 KB, 下载次数: 195
关注者: 1
楼主可否告知,a.txt的数据是灰度图的吗
关注者: 1
T=dlmread('E:\360data\重要数据\桌面\a.txt',' ');
T=int8(T);
[A B]=size(T);
M=reshape(T,sqrt(B),sqrt(B));
imshow(M);
19:53 上传
点击文件名下载附件
6.34 KB, 下载次数: 117
回复 2# qiude 的帖子
我也只是猜测,老师就给了一个这个,就让还原为图像:L
回复 3# qiude 的帖子
你好,你用的是MATLAB2010版的,你的附件我打不开,程序也运行不出来,是不是版本问题啊
关注者: 1
回复 5# elmer0326 的帖子
你的txt文件里最后有个空格需要去掉
关注者: 1
代码应该可以运行的
回复 6# qiude 的帖子
还是有问题,须知道什么原因,我再研究一下,先给你个红心,呵呵
关注者: 61
% By lyqmath @ Matlab中文论坛
I = load('c:\\a.txt');
I = reshape(I, sqrt(numel(I)), sqrt(numel(I)));
I = uint8(I);
imshow(I, [])
复制代码
未命名.JPG (11.21 KB, 下载次数: 3)
12:56 上传
回复 9# lyqmath 的帖子
版主亲自来解决问题,太让小弟感动了,哈哈,版主能不能交个朋友啊,以后有什么问题可以咨询你啊:)
站长推荐 /1
为其他会员撰写推荐,表示您认可他们对于论坛的出色贡献;
向其他坛友请求推荐,令您的声望页面更有说服力。
赶快学习新功能怎么用吧,推荐写起来!~
Powered by汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
是金子,总会发光的,是镜子,总会反光的……
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
假定名为的文件中以下为文件内容你好我的数据欢迎来到百思论坛这样的文件怎么读入数据呢?方法有多种,现举两个比较简单实用的。方法一:A=importdata(file,space,line)
其中,file是所读取的文件名,space是特定的分隔符,line是一个数字,指文本中字符串文字的行数,如上文的数据中line=4。
此代码的含义是,line行是title,line+1行到end是数据,按特定分隔符space读取数据。此方法可以读取文本在上和数据在下的文件。
A是一个sturct,其中A.data就是所需的数据了。
A=importdata('test.txt',' ',4);%运行即可取得数据A.data
此方法也可以按以下操作获取:在文件菜单中选择,按照提示进行操作至结束。在窗口中输入你好欢迎来到百思论坛
方法二:说明:可以是其他形式,跟读入的数据类型有关,比如这里也可以用等。这里的个数和对应。因以字符串的形式读入,所以有。文件内容形式二(假定文件名为):你好欢迎来到百思论坛说明:这种内容格式的文件用上面的方法是不行的。方法三:
以下是由编写的一种方法,但是需要重新建一个文本。打开文件创建文件判断是否为文件末尾从文件读行判断首字符是否是数值如果是数字行,把此行数据写入文件如果是非数字继续下一次循环将生成的文件导入工作空间,变量名为,实际上它不显示出来
一杯茉莉清茶推荐阅读:
阅读(7846)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_087071',
blogTitle:'matlab 如何读取字符串数据混合的文本文件',
blogAbstract:'如何读取特定规则的文本中的数据呢?\r\n假定名为 test.txt 的文件中以下为文件内容 \" 你好',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'是金子,总会发光的,是镜子,总会反光的……',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}查看: 13274|回复: 2|关注: 0
怎样将matlab中的数据保存到.txt中?
怎样将matlab中的数据保存到.txt中,请大侠指点!!谢谢
主要的high level file I/O routines 是LOAD 和 SAVE函数。LOAD
可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt :
1 5 4 16 8
5 43 2 6 8
6 8 4 32 1
90 7 8 7 6
5 9 81 2 3
用 LOAD and SAVE 读写数据
% Load the file to the matrix, M :
M = load('sample_file.txt')
% Add 5 to M :
% Save M to a .mat file called 'sample_file_plus5.mat':
save sample_file_plus5 M
% Save M to an ASCII .txt file called 'sample_file_plus5.txt' :
save sample_file_plus5.txt M -ascii
UIGETFILE/UIPUTFILE
UIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。UIGETFILE让你选择一个文件来写(类似Windows ‘另存为’选项?)。用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。
用 UIGETFILE 从当前目录选择一个 M-file
% This command lists all the M-files in the current directory and
% returns the name and path of the selected file
[fname,pname] = uigetfile('*.m','Sample Dialog Box')
注意: UIGETFILE 一次只能选择一个文件。
UIIMPORT/IMPORTDATA
UIIMPORT是一个功能强大,易于使用的基于GUI的high level routine,用于读complex data files。文件也必须是homogeneous。
IMPORTDATA形成UIIMPORT的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件'sample_file2.txt' :
This is a file header.
This is file is an example.
col1 col2 col3 col4
A& & 1& &4& & 612.000
B& & 1& &4& & 613.000
C& & 1& &4& & 614.000
D& & 1& &4& & 615.000
Example: Using IMPORTDATA to read in a file with headers, text, and numeric data
% This reads in the file 'sample_file2.txt' and creates a
% structure D that contains both data and text data.
% Note the IMPORTDATA command specifies a white space
% as the delimiter of the file, but IMPORTDATA can usually
% detect this on its own
D = importdata('sample_file2.txt','')&&% 原文有误?
D = importdata('sample_file2.txt')
可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入:
data = D.data
text = D.textdata
可以用UIIMPORT读同一个文件并得到同样的结构.
注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。
TEXTREAD/STRREAD
TEXTREAD 是一个强大的动态high level routine,设计用来读ASCII格式的文本和/或数值数据文件。STRREAD除是从字符串而不是文件读以外,类似于TEXTREAD。
两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个
“两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level routines的做法),并且你可以改变他们以匹配你特定的应用(如同low level routines做到的)。例子:
Example 1: Using TEXTREAD to read in an entire file into a cell array
% This command reads in the file fft.m into the cell array, file
file = textread('fft.m','%s','delimiter','\n','whitespace','');
Example 2: Using STRREAD to read the words in a line
% This command uses the cell array created in Example 1 to
% read in each word of line 28 in 'file' to a cell array, words
words = strread(file{28},'%s','delimiter','')
Example 3: Using TEXTREAD to read in text and numeric data from a file with headers
% This command skips the 2 header lines at the top of the file
% and reads in each column to the 4 specified outputs
[c1 c2 c3 c4] = textread('sample_file2.txt','%s %s %s %s','headerlines',2)
Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file
% This command reads in rows B and C of the file. The 'headerlines'
% property is used to move down to the desired starting row and the
% read operation is performed 2 times
[c1 c2 c3 c4] = textread('sample_file2.txt',...
'%s %s %s %s',2,'headerlines',4)
Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers
% This command reads in only the numeric data in the file. The
% 'headerlines' property is used to move down to the first row
% of interest and the first column of text is ignored with the
% '*'&&operator
[c2 c3 c4] = textread('sample_file2.txt','%*s %d %d %f','headerlines',3)
DLMREAD/DLMWRITE/CSVREAD
DLMREAD 和 DLMWRITE函数能够读写分隔的ASCII data,而不是用low level routines。他们比low level routines容易使用,Low level routines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。
CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。以'sample_file.txt'为例:
Example 1: Using DLMREAD to read in a file with headers, text, and numeric data
% This reads in the file 'sample_file2.txt' and creates a matrix, D,
% with the numeric data this command specifies a white space as the
% delimiter of the file
D = dlmread('sample_file.txt','')
Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows
% This reads in the first 3 columns of the last 3 rows of
% the data file 'sample_file.txt'into the matrix, D_partial.
% 读文件 'sample_file.txt' 前3列后3行,到矩阵D_partial.
D_partial = dlmread('sample_file.txt','',[2 0 4 2])
Example 3: Using DLMWRITE to write a comma delimited file
% This creates a file called 'partialD.txt' that consists of
% the first 3 columns of the last 3 rows of data where each
% element is separated by a comma
dlmwrite('partialD.txt',D_partial,',')
注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。
WK1READ/WK1WRITE
WK1READ 用来读Lotus123 电子数据表文件的数据;WK1WRITE用来写矩阵到Lotus123 电子数据表文件。
XLSREAD用来读Excel的数值和文本数据。
---------------------------------------------------------------------------------------------------------
三. 具体例子分析:
Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了:
1. 纯数据(列数相同):
0 8.938 141.140
1 8.475 141.252
2 8.936 141.156
3 9.191 141.230
4 3.726 141.261
5 2.433 141.277
6 4.381 141.256
7 4.261 141.228
8 4.299 141.243
9 2.417 141.253
10 6.653 141.236
11 9.248 141.223
12 9.118 141.186
解答:对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。
2.字段名(中、英文字段均可)+数据:
CH0 CH1 CH2 CH3
0....000598
0....000698
解答:由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用 importdata 便可。
3.注释(含有独立的数字串)+数据(列数相同):
问题:这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件
Group 2&&12.02.2006& &Limei
Samples of datas: 50000
CH0&&CH1&&CH2&&CH3
0..000325& &0.000378& &0.000598
0..000256& &0.000245& &0.000698
目标文件:
Group 2 12.02.2006 Limei
Samples of datas: 50000
解答:由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata, load等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即:[a b c d] = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下:
-------------------------------------转 ---------------------------------------------------------------------------------------
fid = fopen('exp.txt', 'r');
fid_n=fopen('ex.dat','w');
while ~feof(fid)
& & tline=fgetl(fid);
& & if ~isempty(tline)
& && &&&if double(tline(1))&=48 && double(tline(1))&=57&&%数值开始
& && && && &a=strread(tline);
& && && && &a(3:4)=[];
& && && && &fprintf(fid_n,'%f %f\n',a);
& && && && &
& && &&&elseif double(tline(1))==67& &%字母C开始
& && && &&&[b1,b2,b3,b4]=strread(tline,'%s %s %s %s');
& && && &&&b=[b1{1},'&&',b2{1}];
& && && && &fprintf(fid_n,'%s\n',b);
& && && && &clear b b1 b2 b3 b4;
& && &&&else
& && && && &fprintf(fid_n,'%s\n',tline);
& && &&&end
& && &&&fprintf(fid_n,'%s\n',tline);
fclose(fid);
fclose(fid_n);
---------------------------------------------------------------------------------
4. 注释(不含独立的数字串)+数据(列数相同):
欢迎来到 我们
1 11 111 1111
2 22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555
解答:直接用 importdata 便可
注:有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。
5. 注释与数据混排:
对此当然只能自己编程,举例:
1 11 111 1111
2 22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555
--------------------------------------------转--------------------------------------
function [data]=distilldata(infile)
%功能说明:
%将保存数据的原始文件中的数值数据读入到一个data变量中
%使用说明:
% infile——原始数据文件名;
% data=数据变量
tmpfile='tmp2.mat';
fidin=fopen(infile,'r'); % 打开原始数据文件(.list)
fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字)
while ~feof(fidin) % 判断是否为文件末尾
&&tline=fgetl(fidin); % 从文件读入一行文本(不含回车键)
&&if ~isempty(tline) % 判断是否空行
& & [m,n]=size(tline);
& & flag=1;
& & for i=1:n %判断一行中有没有字符(+-.Ee和空格键除外)
& && &if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'...
& && && & |tline(i)=='e'|tline(i)=='+'...
& && && & |(double(tline(i))&=48&&double(tline(i))&=57))
& && &&&flag=0;
& & if flag==1 % 如果是数字行,把此行数据写入文件
& && &fprintf(fidtmp,'%s\n',tline);
fclose(fidin);
fclose(fidtmp);
data=textread(tmpfile);
delete(tmpfile);
---------------------------------------------------------------------------------------------------------
另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释)
6.各列数据的分离:
& && && &&&0 +&&47038.7& &1.05&&09:26:07&&C
& && && &&&2 +&&46477.7& &1.03&&09:28:38&&C&&
& && && &&&4 +&&44865.7& &1.04&&09:28:48&&C&&
& && && &&&6 +&&41786.4& &1.03&&09:28:56&&C&&
& && && &&&8 +&&39896.0& &0.97&&09:29:03&&C&&
& && && & 10 +&&37518.4& &0.93&&09:29:15&&C&&
& && && & 12 +&&35858.5& &0.92&&09:29:30&&C&&
& && && & 14 +&&46105.0& &1.03&&09:30:21&&C&&
& && && & 16 +&&46168.6& &6.89&&09:30:30&&C&&
& && && & 18 +&&48672.3& &4.33&&09:30:40&&C&&
& && && & 20 +&&49565.7& &0.49&&09:30:48&&C&&
& && && & 22 +&&49580.7& &0.53&&09:30:55&&C&&
& && && & 24 +&&49602.3& &0.84&&09:31:03&&C&&
& && && & 26 +&&49582.5& &1.51&&09:31:11&&C&&
& && && & 28 +&&49577.0& &1.39&&09:31:19&&C&&
& && && & 30 +&&49589.3& &0.61&&09:31:27&&C&&
& && && & 32 +&&49578.3& &1.06&&09:31:29&&C&&
& && && & 34 +&&49512.5& &1.77&&09:31:38&&C
解答:直接用 [a,b,c,d,e,f]=textread(yourfilename,'%d %c %f %f %s %c'); 便可
四. 注意事项:
1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。
2. 存取时,请给出该数据文件的全称(包括后缀名,读取mat文件时可省略)
3. load data.txt和A=load(‘data.txt’)的区别请参阅精华贴:[原创]写给学习 matlab 的新手们
4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个错误的例子:
filename='e.dat';
fid=fopen(filename,'a');
& & error('fopen error');
s=[1 2 3 4;5 6 7 8];
fwrite(fid,s,'float32')
[dd ll]=fread(fid,inf,'float32');%把t中的数据全部读出,即s矩阵。
fclose(fid);
此时得到的dd, ll 是错误且无意义的!
五. 其他相关问题:
1. 连续读取多个文件的数据,并存放在一个矩阵中:
(1) 首先是如何读取文件名:
filename=dir(‘*.jpg’);
那么第i个文件的文件名就可以表示为
filename(i).name
文件数量为:length(filename)
先在Windows的 MSDOS(命令行)中使用以下命令生成一个list.txt文件:
dir path\folder /on /b /s & path\list.txt
举例:dir d:\test /on /b /s & d:\list.txt
然后在 matlab 中使用:
filename = textread(sFileFullName,'%s');
把所有文件名读取到list细胞矩阵中,最后对filename{i}便可得到各文件名。
(2) 然后是读取文件名的数据并存储:
假设每个文件对应的数据是m*n的,则:
k = length(filename);
Data = zeros(m,n,k);
for ii = 1:k
&&Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle是对应的文件读取方式的函数
2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中:
假设每个文件对应的数据是m*n的,则以上述第二种文件名读取方法为例:
k = length(filename);
for ii = 1:k
&&D = yourreadstyle(filename{ii});
eval([‘Data_’, num2str(ii), ‘ = D;’]);
3. 文件名命名问题:
文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879.&&准备把这些文件名给放到一个数组里面去。
a=cell(879,1);
for k=1:879
& &&&a{k} = sprintf('%.5d',k);
4. 上述各种文件格式、类型自动识别问题:可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例1到例5各种情形,不过由于存在自动判断,对某些例子(如例1)效率自然要低一点,而对于另外的例子(如例3、例5)效率估计要高一点(少用了一个循环)。
function [data]=distilldata_eight(infile)
%功能说明:
%将保存数据的原始文件中的数值数据读入到一个data变量中(自动判断数据行)
%使用说明:
% infile——原始数据文件名;
% data=数据变量
tmpfile='tmp2.mat';
fidin=fopen(infile,'r'); % 打开原始数据文件(.list)
fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字)
while ~feof(fidin) % 判断是否为文件末尾
&&tline=fgetl(fidin); % 从文件读入一行文本(不含回车键)
&&if ~isempty(tline) % 判断是否空行
& & str = '[^0-9 | \. | \- | \s | e | E]'; %正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符
& & start = regexp(tline,str, 'once');
& & if isempty(start)
& && &fprintf(fidtmp,'%s\n',tline);
fclose(fidin);
fclose(fidtmp);
data=textread(tmpfile);
delete(tmpfile)
5. 大量数据的读取问题:
可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: [原创]提高matlab运行速度和节省空间的一点心得(之三))。另外,也可参考《深入浅出MATLAB 7_X混合编程》一书第一章
6. 读取整个txt文件的内容(获得文件中的所有字符):
f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略
x = fread(f,'*char');
fclose(f);
7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = [1 2 3;4 5 6] ,希望得到的 txt 文件如下:
如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦:
a2=[1 2 3;4 5 6];
fid = fopen('myfile.txt', 'wt');
& & fprintf(fid, '%s: \n %s\n', ['a',int2str(i)], mat2str(eval(['a',int2str(i)])));
fclose(fid);
相反,如果写入的时候复杂一点,则读取的时候会简单一点:
a2=[1 2 3;4 5 6];
fid = fopen('myfile.txt', 'wt');
& & fprintf(fid, '%s: \n', ['a',int2str(i)]);
& & b = eval(['a',int2str(i)]);
& & fprintf(fid, [repmat('%d ', 1, size(b,2)), '\n'], b');
fclose(fid);
zhuanzhibo 发表于
主要的high level file I/O routines 是LOAD 和 SAVE函数。LOAD
谢谢喽.........
站长推荐 /1
为其他会员撰写推荐,表示您认可他们对于论坛的出色贡献;
向其他坛友请求推荐,令您的声望页面更有说服力。
赶快学习新功能怎么用吧,推荐写起来!~
Powered by

我要回帖

更多关于 matlab读取txt数据 的文章

 

随机推荐