从.txt文件里读取数据到matlab里
我现在想从.txt文件里读取数据到matlab里。不过.txt里的数据比较复杂,我不知道该怎么办了,请大家帮帮忙。.txt里面的数据第一行:0qid:100021:0.0...
我现在想从.txt文件里读取数据到matlab里。不过.txt里的数据比较复杂,我不知道该怎么办了,请大家帮帮忙。
.txt里面的数据第一行:
0 qid:10002 1:0.007477 2:0.000000 3:1.000000 4:0.000000 5:0.007470 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.471076 12:0.000000 13:1.000000 14:0.000000 15:0.477541 16:0.005120 17:0.000000 18:0.571429 19:0.000000 20:0.004806 21:0.768561 22:0.727734 23:0.716277 24:0.582061 25:0.000000 26:0.000000 27:0.000000 28:0.000000 29:0.780495 30:0.962382 31:0.999274 32:0.961524 33:0.000000 34:0.000000 35:0.000000 36:0.000000 37:0.797056 38:0.697327 39:0.721953 40:0.582568 41:0.000000 42:0.000000 43:0.000000 44:0.000000 45:0.000000 46:0.007042 #docid = GX008-86-4444840 inc = 1 prob = 0.086622
我现在想要第一列的0,第二列不要,要第三列的0.007477。。。。第三列的0.007042最后#docid = GX008-86-4444840 inc = 1 prob = 0.086622不要了。
也就是第二列不要:,第三列不要1:,第四列不要2:。。。。。最后的#docid = GX008-86-4444840 inc = 1 prob = 0.086622这几列都不要了。
用提取出的数据写成矩阵。
该怎么办呢? 展开
.txt里面的数据第一行:
0 qid:10002 1:0.007477 2:0.000000 3:1.000000 4:0.000000 5:0.007470 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.471076 12:0.000000 13:1.000000 14:0.000000 15:0.477541 16:0.005120 17:0.000000 18:0.571429 19:0.000000 20:0.004806 21:0.768561 22:0.727734 23:0.716277 24:0.582061 25:0.000000 26:0.000000 27:0.000000 28:0.000000 29:0.780495 30:0.962382 31:0.999274 32:0.961524 33:0.000000 34:0.000000 35:0.000000 36:0.000000 37:0.797056 38:0.697327 39:0.721953 40:0.582568 41:0.000000 42:0.000000 43:0.000000 44:0.000000 45:0.000000 46:0.007042 #docid = GX008-86-4444840 inc = 1 prob = 0.086622
我现在想要第一列的0,第二列不要,要第三列的0.007477。。。。第三列的0.007042最后#docid = GX008-86-4444840 inc = 1 prob = 0.086622不要了。
也就是第二列不要:,第三列不要1:,第四列不要2:。。。。。最后的#docid = GX008-86-4444840 inc = 1 prob = 0.086622这几列都不要了。
用提取出的数据写成矩阵。
该怎么办呢? 展开
5个回答
展开全部
% 打开文件(注意修改文件名)
fid = fopen('480684994.txt','rt');
if fid == 0, return, end
% 读文件直到结束
while ~feof(fid)
% 每次读入一行
s = fgetl(fid);
% 以空格作为数据项的分隔符
% 注意:
% 数据格式必须满足以下要求,否则需要改写代码
% 1、数据的分隔符必须是空格;
% 2、数据项例如“1:0.007477”里面不可以有空格
idx = [0 find(s==' ') length(s)+1];
% 第一项数据
A = [];
A(1) = str2num( s(1:idx(2)-1) );
% 舍去第二列,所以从第三列开始处理
for i = 3 : length(idx) - 1
% 每项有效数据必须包含一个“:”
str = s( idx(i)+1 : idx(i+1) - 1 );
iidx = find( str == ':' );
if length(iidx) ~= 1, continue, end
A(end+1) = str2num( str(iidx+1:end) );
end
% 本行读入的结果保存在变量A中,后续如何处理请自行完成
A
end
% 关闭文件
fclose(fid);
fid = fopen('480684994.txt','rt');
if fid == 0, return, end
% 读文件直到结束
while ~feof(fid)
% 每次读入一行
s = fgetl(fid);
% 以空格作为数据项的分隔符
% 注意:
% 数据格式必须满足以下要求,否则需要改写代码
% 1、数据的分隔符必须是空格;
% 2、数据项例如“1:0.007477”里面不可以有空格
idx = [0 find(s==' ') length(s)+1];
% 第一项数据
A = [];
A(1) = str2num( s(1:idx(2)-1) );
% 舍去第二列,所以从第三列开始处理
for i = 3 : length(idx) - 1
% 每项有效数据必须包含一个“:”
str = s( idx(i)+1 : idx(i+1) - 1 );
iidx = find( str == ':' );
if length(iidx) ~= 1, continue, end
A(end+1) = str2num( str(iidx+1:end) );
end
% 本行读入的结果保存在变量A中,后续如何处理请自行完成
A
end
% 关闭文件
fclose(fid);
追问
你好,我试过了,你的程序是对的。
但是我想问一下,A(end+1) = str2num( str(iidx+1:end) );中的end是什么意思啊?是变量么?还是什么其他的?
谢谢!
哦,我已经查到了。谢了。给你100分。以后有什么问题可能还得问你。谢了!
推荐于2016-12-04
展开全部
根据txt文档不同种类介绍不同的读取数据方法;
一、纯数据文件(没有字母和中文,纯数字);
二、中英文和数据如test1.txt;
三、中文 数据 英文 混乱如test.txt;
方法一:
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 =
'你好'
'欢迎来到'
'论坛'
'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
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
一、纯数据文件(没有字母和中文,纯数字);
二、中英文和数据如test1.txt;
三、中文 数据 英文 混乱如test.txt;
方法一:
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 =
'你好'
'欢迎来到'
'论坛'
'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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你们老师出的题吗?这么变态,,直接复制粘贴不就完了,干嘛要多此一举.... 非要那么搞的话.就把数据先读进来,然后根据空格来分割数据项,再看看一行有多少列... 完后去掉不要列
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
到底怎么复杂?给个例子看看
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先将所有数据读入到matlab中存储,然后在matlab中对这些数据在进行处理,你看行不行?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询