免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2348 | 回复: 14
打印 上一主题 下一主题

文件内插问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-28 18:00 |只看该作者 |倒序浏览
我要修改一个文件,这个文件内容是一长行(没有换行符),由固定长度的字符串组成(5万个左右)
比如:
  1. 111AAA$$222BBB%%%333CCC&&&&
复制代码
我需要把这个文件的格式改为:
  1. 111,AAA,$$
  2. 222,BBB,%%%%
  3. 333,CCC,&&&&
复制代码
我目前的思路是将文件先按段加上回车输出到新文件上
再用正则取出对应数据段
然后join加分隔符

请问我这种操作可否在源文件上直接修改?效率会比写入新文件高吗?

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
2 [报告]
发表于 2013-01-28 18:39 |只看该作者
lz的数据没什么规律吗?

论坛徽章:
0
3 [报告]
发表于 2013-01-28 21:41 |只看该作者
只有每段固定长度的约束回复 2# 只是一个红薯


   

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-06-23 06:20:00
4 [报告]
发表于 2013-01-28 23:07 |只看该作者
本帖最后由 jiang870320 于 2013-01-28 23:08 编辑

use strict;
use warnings;
my $str='111AAA$$222BBB%%%333CCC&&&&';
my @arr=split /(?=\d{3})/,$str;
foreach my $num (0..$#arr){
my $string=$arr[$num];
$string=~/(\d{3})(\w{3})(.*)/;
my $result=join(",","$1","$2","$3");
print "$result\n";
}

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-06-23 06:20:00
5 [报告]
发表于 2013-01-28 23:11 |只看该作者
楼主,看一下我的行不行。回复 1# DexterL

[root@bogon perl]# vim test_split1.pl 
[root@bogon perl]# ./test_split1.pl   
111,AAA,$$
222,BBB,%%%
333,CCC,&&&&


code:
#!/usr/bin/perl
use strict;
use warnings;
my $str='111AAA$$222BBB%%%333CCC&&&&';
my @arr=split /(?=\d{3})/,$str;
foreach my $num (0..$#arr){
#print "$arr[$num]\n";
my $string=$arr[$num];
$string=~/(\d{3})(\w{3})(.*)/;
#print "$1\n";
#print "$2\n";
#print "$3\n";
my $result=join(",","$1","$2","$3");     
print "$result\n";
}

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
6 [报告]
发表于 2013-01-28 23:23 |只看该作者
回复 1# DexterL
我猜。。。。
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my $count;
  5. my @arr;
  6. my $str = '111AAA$222BBB%%%333CCC&&&&';
  7. while($str =~ /((.)\2+)(?{$count++;})/g){
  8.     push @arr,$1;
  9.         print join(",",@arr),"\n" and undef @arr if($count % 3 ==0);  
  10. }
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
7 [报告]
发表于 2013-01-29 02:00 |只看该作者
行不?
  1. #!/usr/bin/perl
  2. s/((.)\2+)((.)\4+)((.)\6+)/$1,$3,$5\n/g and print while <DATA>;
  3. __DATA__
  4. 111AAA$222BBB%%%333CCC&&&&
复制代码

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
8 [报告]
发表于 2013-01-29 09:47 |只看该作者
试了下,ls几位输出都不对啊, jiang870320  的代码在给定数据可行,lz说的“只有每段固定长度的约束”,数据格式不确定

论坛徽章:
0
9 [报告]
发表于 2013-01-29 10:45 |只看该作者
回复 4# jiang870320

回复 6# mcshell

回复 7# rubyish

诸位的指导我都仔细看过了 得到不少启发 自叹基本功太差 日后一定要重读小羊驼书
我觉得是我提问的方式太笼统了 我在详细描述一遍我的需求吧
我有一行长数据,每个数据段的格式为:
8个数字6个数字40个任意字符(包含数字和空格):
781010030004281哈哈567                                 78171001000105呵呵456                                 
我想要得到的结果是
  1. 78101003,000567,1哈哈567                                 
  2. 78171001,000456,呵呵456                                 
复制代码
我根据楼上朋友的提示写出了如下代码
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use File::Copy;

  5. open (DATA_FILE ,"testfile") or die "Cannot open data file:$!";

  6. while (<DATA_FILE>){
  7.        my @arr=split /(\d{14}.{40})/;
  8.        foreach (@arr){
  9.              my @tmp=unpack("A8A6A40",$_);   
  10.              print join(",",@tmp),"\n";
  11.        }   
  12. }
复制代码
但是结果为:
  1. ,,
  2. 78101003,000567,1哈哈567                                 
  3. ,,
  4. 78171001,000456,呵呵456                                 
  5. ,,
复制代码
中间的空项是怎么产生的呀。。?

论坛徽章:
0
10 [报告]
发表于 2013-01-29 10:47 |只看该作者
回复 8# 只是一个红薯

确实是我自己没说清楚 劳烦您再看一下我的回复


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP