找回密码
 注册
Simdroid-非首页
查看: 282|回复: 14

如何读取数值和字符混合型文本文件中的数值型数据(正则表达式)[有代码]

[复制链接]
发表于 2010-11-8 16:09:51 | 显示全部楼层 |阅读模式 来自 浙江杭州
本帖最后由 messenger 于 2010-11-12 19:43 编辑

data.in文本文件包含以下信息:
a
b
c
0 1 2 3 0 0
   1 2 3 0 0 →注意本行开头是两个空格!
0 4 5 6 0 0
d
e
0 7 8 9 0 0
   7 8 9 0 0 →注意本行开头是两个空格!
0 10 11 12 0
请问如何将其中的非零数值型数据写入data.out文本文件?
我要的结果是data.out文件只包含下面的数据:
1 2 3
1 2 3
4 5 6
7 8 9
7 8 9
10 11 12
请各位朋友积极建言献策。小弟在此先行谢过!
发表于 2010-11-8 16:34:34 | 显示全部楼层 来自 湖南湘潭
Simdroid开发平台
用正则表达式函数regexp()把每一行的非零数值提取出来。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-8 19:49:23 | 显示全部楼层 来自 河北廊坊
看你的输入数据结构是不是很规范了,如果是你写出的这样,那么可以将每行前两个字符去掉,然后取剩余的前三个数字就可以了。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-8 19:51:58 | 显示全部楼层 来自 浙江杭州
本帖最后由 hylovegj 于 2010-11-8 19:53 编辑
用正则表达式函数regexp()把每一行的非零数值提取出来。
lin2009 发表于 2010-11-8 16:34

“lin2009”兄,能否麻烦您说想详细一点?最好写个m文件把具体操作方法贴出来。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-8 21:32:14 | 显示全部楼层 来自 浙江杭州
看你的输入数据结构是不是很规范了,如果是你写出的这样,那么可以将每行前两个字符去掉,然后取剩余的前三个数字就可以了。
feynmand 发表于 2010-11-8 19:49

这个是FEA软件分析产生的结果文件,格式是一样的,数据被我简化了。我要用for循环不断修改里面的这些数值型数据,调用FEA软件分析,所以根本不可能手动去掉前面的空格。等待更完善的做法。。。
回复 不支持

使用道具 举报

发表于 2010-11-8 21:47:43 | 显示全部楼层 来自 黑龙江哈尔滨
对于你的数据,只需用fgets读进来一行,将前两个字符去掉,然后只读取3个数字不就可以了吗?
仅仅提供一种思路...

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-9 12:46:27 | 显示全部楼层 来自 辽宁沈阳
就用fgets或者fgetl读取一行 然后选取就行 以前用这个做过ABAQUS的inp文件的转换
回复 不支持

使用道具 举报

发表于 2010-11-9 14:38:14 | 显示全部楼层 来自 河北廊坊
  1. clear;clc;close all
  2. fid=fopen('data.in');
  3. fid1=fopen('data.out','w');
  4. while ~feof(fid)
  5.     tline = fgetl(fid);
  6.     str=textscan(tline,'%s','delimiter',' ');
  7.     strd=str2double(str{:});
  8.     if all(isnan(strd))
  9.         continue;
  10.     else
  11.         data=nonzeros(strd(~isnan(strd)));
  12.         fprintf(fid1,'%d ',data');
  13.     end
  14.     fprintf(fid1,'\n');
  15. end
  16. fclose(fid);
  17. fclose(fid1);
  18. dbtype data.out
复制代码

  1. 1     1 2 3
  2. 2     1 2 3
  3. 3     4 5 6
  4. 4     7 8 9
  5. 5     7 8 9
  6. 6     10 11 12
复制代码
注:本程序只适用于此种形式的数据,如果文件中的数据有变,就灵活调整程序

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-10 13:50:38 | 显示全部楼层 来自 北京
感觉continue可以不用,把else的那部分提到前面,else部分可不写,也可用disp或者error之类写个提示什么的。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-11 01:35:00 | 显示全部楼层 来自 浙江杭州
本帖最后由 hylovegj 于 2010-11-11 01:37 编辑

特别感谢qibbxxt 版主关于如何跳过非数值行的思路。我要处理的数据比我在帖子里举的要复杂,但在qibbxxt 版主的启发下问题已得到解决。我会贴出原问题和我的初步解答方法,请大家帮我改进。感谢大家的帮助!
回复 不支持

使用道具 举报

发表于 2010-11-12 19:11:18 | 显示全部楼层 来自 湖南湘潭
感觉应该不会像8#那样复杂,就重新看了一下Matlab的正则表达式。
发现这样的问题用正则表达式处理很简单。
程序和说明(注释)如下:
data.in文本文件包含以下信息:
a
b
c
0 1 2 3 0 0
   1 2 3 0 0 →注意本行开头是两个空格!
0 4 5 6 0 0
d
e
0 7 8 9 0 0
   7 8 9 0 0 →注意本行开头是两个空格!
0 10 11 12 0
请问如何将其中的非零数值型数据写入data.out文本文件?

  1. objstr = fileread('data.in'); % 将整个文件文本以字符串形式读取,赋给变量。
  2. pat = '(([1-9]\d*)\s+){2}([1-9]\d*)';  % 正则表达式模式,读取三个以空格分开的整数。
  3. m = regexp(objstr,pat,'match');     % 行模式
  4. fid = fopen('data.out','w');
  5. fprintf(fid, '%s\n', m{:});                  % 不用循环,直接写入目标文件
  6. fclose(fid);
复制代码
data.out文件即为1#所需。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-12 20:06:53 | 显示全部楼层 来自 北京
正则表达式的介绍MATLAB帮助文档说得很详细,而且正则表达式运用好了,很多时候也非常给力。不想看英文的同学可以看看WaitingForMe和sogooda的这两个帖子:
http://forum.simwe.com/thread-469324-1-1.html
http://forum.simwe.com/viewthread.php?tid=810764
回复 不支持

使用道具 举报

发表于 2010-11-13 08:50:53 | 显示全部楼层 来自 浙江杭州
这个帖子的回帖阵容可谓空前强大啊!三个版主,一个VIP会员,一个五级会员,而且还那么多高水准代码,够给力!要是论坛里的每个问题贴都可以这么火爆,得到这么多高人的关注,仿真论坛的学术氛围一定会越来越浓厚的。
回复 不支持

使用道具 举报

发表于 2010-11-14 18:39:21 | 显示全部楼层 来自 LAN
都是高人。 学习了,尽管我很多都看不懂。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-24 17:48:45 | 显示全部楼层 来自 浙江杭州
我自己写了一段很菜的代码,方法很笨,但思路很清晰,对不会正则表达式的朋友也是一种可以考虑的选择。下面是代码,大家可以帮我改进一下。

  1. fid_in = fopen('data.in');
  2. fid_out = fopen('data.out','w');
  3. i = 0;
  4. while ~feof(fid_in) % 判断文件指针是否达到文件末尾
  5.     tline = fgetl(fid_in); % 将文件指针所在的行作为一个字符串整体读入
  6.     if isnan(str2double(strread(tline,'%s%*[^\n]')))
  7.         continue;% 跳过以字母开头的行
  8.     else
  9.         i = i + 1;% i用于统计数据行,并作为存储所读取数据的数组元素的下标
  10.         if strncmp(tline,'0',1)
  11.             [a(i),b(i),c(i)]=strread(tline,'%*d%d%d%d%*[^\n]');
  12.             % 读取以0开头的数据行中的非零数据
  13.         else
  14.             [a(i),b(i),c(i)]=strread(tline,'%d%d%d%*[^\n]');
  15.             % 读取不是以0开头的数据行中的非零数据
  16.         end
  17.     end
  18.     fprintf(fid_out,'%d  %d  %d\n',a(i),b(i),c(i));
  19.     % 将所读取的数据写入data.out文件
  20. end
  21. fclose(fid_in);
  22. fclose(fid_out);
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-5 09:27 , Processed in 0.063852 second(s), 23 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表