matlab - 中读取文本文件
发布时间:2011-10-26 19:34:13
发布时间:2011-10-26 19:34:13
matlab 中如何读取文本文件(转)
下面这个函数是取filein中的第line行写入fileout中的程序,如果想实现取特定几行,只要稍微修改一下就可以。
function dataout=dataread(filein,fileout,line)
fidin=fopen(filein,'r');
fidout=fopen(fileout,'w');
nline=0;
while ~feof(fidin) % 判断是否为文件末尾
tline=fgetl(fidin); % 从文件读行
nline=nline+1;
if nline==line
fprintf(fidout,'%s\n',tline);
dataout=tline;
end
end
fclose(fidin);
fclose(fidout);
%%%%%%%%%%%%%%%%%%%%%%%%%%
调用格式:dataout=dataread(filein,fileout,line)
如果你的txt文件数据是矩阵形式的,而没有其它的文字,用下面的程序就可以读任意行任意列的数据
a=textread('ll.txt');
t=a(1:43,4:10); //大鹏之风
1:43是1到43行,4:10是4到10列的数据,当然也可以只读一个数据,如果你的matlab没有textread函数,直接从mathworks网站下载就行。
根据txt文档不同种类介绍不同的读取数据方法
转自:http://hi.baidu.com/youngbrave/blog/item/878db31fcd4f220f304e15bb.html
一、纯数据文件(没有字母和中文,纯数字)
对于这种txt文档,从matalb中读取就简单多了
例如test.txt文件,内容为“17.901 -1.1111 33.045
17.891 -1.1286 33.045
17.884 -1.1345 33.045”
可以在command window中输入load test.txt ,然后就会产生一个test的数据文件,内容跟test.txt中的数据一样;另一种方法是在file/import data....../next/finish 也可产生一个叫test的数据文件。
二、中英文和数据如test1.txt
“你好
欢迎来到
振动论坛
vib.hit.edu.cn
1 11 111 1111
2 22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555”
这样的文件怎么读入数据呢?
方法有多种,现举两个比较简单实用的。
方法一:
file/import data....../next/finish
>> whos
Name Size Bytes Class
data 5x4 160 double array
textdata 4x1 300 cell array
Grand total is 54 elements using 460 bytes
>> data
data =
1 11 111 1111
2 22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555
>> textdata
textdata =
'vib.hit.edu.cn'
方法二:
[a1,a2,a3,a4]=textread('test1.txt','%s%s%s%s','headerlines',4)
说明:%s可以是其他形式,跟读入的数据类型有关,比如这里也可以用%n,%f等。
这里%s的个数和[a1,a2,a3,a4]对应。
>> [a1,a2,a3,a4]=textread('test1.txt','%s%s%s%s','headerlines',4)
a1 =
'1'
'2'
'3'
'4'
'5'
a2 =
'11'
'22'
'33'
'44'
'55'
a3 =
'111'
'222'
'333'
'444'
'555'
a4 =
'1111'
'2222'
'3333'
'4444'
'5555'
因以字符串的形式读入,所以有''。
————————————————————————————————
三、中文数据 英文 混乱如test.txt
你好
1 11 111 1111
欢迎来到
2 22 222 2222
振动论坛
3 33 333 3333
vib.hit.edu.cn
4 44 444 4444
5 55 555 5555
说明:这种内容格式的文件用上面的方法是不行的。
以下是由chinamaker编写的一种方法:
fidin=fopen('test.txt'); % 打开test2.txt文件
fidout=fopen('mkmatlab.txt','w'); % 创建MKMATLAB.txt文件
while ~feof(fidin) % 判断是否为文件末尾
tline=fgetl(fidin); % 从文件读行
if double(tline(1))>=48&&double(tline(1))<=57 % 判断首字符是否是数值
fprintf(fidout,'%s\n\n',tline); % 如果是数字行,把此行数据写入文件MKMATLAB.txt
continue % 如果是非数字继续下一次循环
end
end
fclose(fidout);
MK=importdata('MKMATLAB.txt'); % 将生成的MKMATLAB.txt文件导入工作空间,变量名为MK,实际上它不显示出来
>> MK
MK =
1 11 111 1111
2 22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555
Matlab中从文件夹中批量读取文件的做法
function [read_data]=batch_read_file(file_type);
% <<---文件已完成,程序已修正--->>
% 可以读取的文件中,若有列数不相同的,则补 nan
% 数据文件中只能是数字
% *.xls 文件只能是英文或数字命名
% 批量读数据的程序 注,只能读取 *.txt类文件,且文件必须有后缀名
% [read_data_A]=batch_read_file('*.txt')
% [read_data_A]=batch_read_file('*.xls')
% file_type为文件的格式
% 返回值 read_data 为元胞数值,保存谋取到的数据
% 对 xls 文件的说明:
% xls 文件以文件名升序排序
% xls 文件只能容许一个工作表,若有多个,则读取的为名字值最大的一个工作表
% file_type='*.txt'类 or file_type='*.xls';
% 示例:在数据文件中有如下内容 1.txt
% 1 2 3.345 1234.5422 12
% 1.2222 2.3333 3.4444
% 1 2 3 4 5 6 7 8 9
% 读出的数据是一个 (3,9)的矩阵 空缺的部分为 nan
file_read=dir(file_type);% 获得要读取的文件列表
%%%%%%%%%%%%%-+-XLS XLS XLS XLS XLS-+-%%%%%%%%%
% 在此段读取 *.xls 类文件
if strcmp(file_type,'*.xls')
for i=1:length(file_read)
file_name{i}=file_read(i).name;% 获取文件名的列表
% 开始准备向从 xls 文件中读取数据
read_data{i}=xlsread(file_name{i});
end
else
%%%%%%%%%%%%%-+-TXT TXT TXT TXT TXT-+-%%%%%%%%%
% 在此段读取 *.txt 类文件
for i=1:length(file_read)
file_name{i}=file_read(i).name;
fid=fopen(file_name{i},'r');
% 开始准备向从文件中读取数据
k=1;
while ~feof(fid)
% 这儿用fgetl似乎也没有错
temp=fgets(fid);
length_temp_data(k)=length(str2num(temp));% 求长度
temp_read_data{i}{k}=str2num(temp);% 写
%%%%%%%%
k=k+1;
end
%%-----
max_row=max(length_temp_data);% 求最大的长度,以确定补 nan 的个数
%%%%%%
for j=1:k-1
len=length(temp_read_data{i}{j});
if len
temp_read_data{i}{j}(len:max_row)=nan;
end
read_data{i}(j,:)=temp_read_data{i}{j};
end
fclose(fid);
end
end