shirleyice 发表于 2006-3-21 17:27

如何从庞大的数据文件中提取部分数据呢?

比如我的每个数据项的类型如下<BR>2006 3 13 at 12:23:12 , 6.3,46565,(12 13 12),(12 12 13) /n<BR>每项数据之间以回车分开,现在我需要提取每项数据中的第三个元素(例子中的46565)进行画图,<BR>该怎么编程实现呢<BR>数据文件是相当庞大的,不可能人工输入了<BR>数据文件都以例子的格式存储在txt文件中<BR>我是刚学matlab的,急需您的帮助<BR>多谢了<IMG src="http://www.programfan.com/club/image/emotions/17.gif" border=0>

fifa2008 发表于 2006-3-21 18:10

如何从庞大的数据文件中提取部分数据呢?

<P>以前看过的,希望对你有帮助<BR><BR></P>
<P inter-ideograph; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">文件内容形式一(假定文件名为test1.txt):<BR>你好<BR>欢迎来到<BR>动力学与控制技术论坛<BR><a href="http://www.dytrol.com/" target="_blank" >www.dytrol.com</A><BR>1 11 111 1111<BR>2 22 222 2222<BR>3 33 333 3333<BR>4 44 444 4444<BR>5 55 555 5555<BR>这样的文件怎么读入数据呢?<BR>方法有多种,现举两个比较简单实用的。<BR>方法一:<BR>file/import data....../next/finish<BR>&gt;&gt; whos<BR>Name         Size                   BytesClass<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">data         5x4                      160double array<BR>textdata       4x1                      300cell array<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">Grand total is 54 elements using 460 bytes<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">&gt;&gt; data<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">data =<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">         1          11         111      1111<BR>         2          22         222      2222<BR>         3          33         333      3333<BR>         4          44         444      4444<BR>         5          55         555      5555<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">&gt;&gt; textdata<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">textdata = <p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">    '你好'<BR>    '欢迎来到'<BR>    '动力学与控制技术论坛'<BR>    'www.dytrol.com'<BR>方法二:<BR>=textread('test1.txt','%s%s%s%s','headerlines',4)<BR>说明:%s可以是其他形式,跟读入的数据类型有关,比如这里也可以用%n,%f等。<BR>这里%s的个数和对应。<BR>&gt;&gt; =textread('test1.txt','%s%s%s%s','headerlines',4)<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">a1 = <p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">    '1'<BR>    '2'<BR>    '3'<BR>    '4'<BR>    '5'<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify"><BR>a2 = <p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">    '11'<BR>    '22'<BR>    '33'<BR>    '44'<BR>    '55'<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify"><BR>a3 = <p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">    '111'<BR>    '222'<BR>    '333'<BR>    '444'<BR>    '555'<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify"><BR>a4 = <p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; TEXT-INDENT: 18pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">    '1111'<BR>    '2222'<BR>    '3333'<BR>    '4444'<BR>    '5555'<BR>因以字符串的形式读入,所以有''。<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">文件内容形式二(假定文件名为test2.txt):<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">你好<BR>1 11 111 1111<BR>欢迎来到<BR>2 22 222 2222<BR>动力学与仿真控制论坛<BR>3 33 333 3333<BR><a href="http://www.dytrol.com/" target="_blank" >www.dytrol.com</A><BR>4 44 444 4444<BR>5 55 555 5555<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">说明:这种内容格式的文件用上面的方法是不行的。<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">以下是由chinamaker编写的一种方法:<BR>fidin=fopen('test2.txt');                               % 打开test2.txt文件             <BR>fidout=fopen('mkmatlab.txt','w');                     % 创建MKMATLAB.txt文件<BR>while ~feof(fidin)                                    % 判断是否为文件末尾               <BR>    tline=fgetl(fidin);                                 % 从文件读行   <BR>    if double(tline(1))&gt;=48&amp;&amp;double(tline(1))&lt;=57       % 判断首字符是否是数值<BR>       fprintf(fidout,'%s\n\n',tline);                  % 如果是数字行,把此行数据写入文件MKMATLAB.txt<BR>       continue                                       % 如果是非数字继续下一次循环<BR>    end<BR>end<BR>fclose(fidout);<BR>MK=importdata('MKMATLAB.txt');      % 将生成的MKMATLAB.txt文件导入工作空间,变量名为MK,实际上它不显示出来 <BR>&gt;&gt; MK<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">MK =<p></p></P>
<P inter-ideograph; WORD-BREAK: break-all; TEXT-INDENT: 18pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: justify">         1          11         111      1111<BR>         2          22         222      2222<BR>         3          33         333      3333<BR>         4          44         444      4444<BR>         5          55         555      5555<p></p></P>
<P inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; TEXT-ALIGN: justify; mso-char-indent-count: 0">俺一般将数据存成文本,用load导入,再操作。<BR>如:<BR>load qq.dat;<BR>plot(qq(:,1),qq(:,2))<BR>等等,</P>

w89986581 发表于 2006-3-21 19:10

呵呵,我的笨方法是打开txt文件,用替换操作将非数字项用空格全部替换。然后load file.txt;file(:,8)

happy 发表于 2006-3-21 19:12

回复:(shirleyice)如何从庞大的数据文件中提取部分...

用fopen有选择的读取比较好,节省资源,效率高

tianj1234 发表于 2006-3-22 14:50

<P>察看textread的帮助文档,跳过1 2和3以后数据<BR>=textread(file,'%*s%*s%f%*[^\n]',delimiter,',')<BR>大致是这样的</P>

shirleyice 发表于 2006-3-22 17:44

太感谢各位的热情帮助了,我快感动死了。。。

大家说的都挺好的,我尝试一下。。。
页: [1]
查看完整版本: 如何从庞大的数据文件中提取部分数据呢?