免费注册 查看新帖 |

Chinaunix

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

求perl脚本程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-31 15:34 |只看该作者 |倒序浏览
本帖最后由 nulijq 于 2012-05-31 15:45 编辑

需求如下:
如:'20120520','aa','bb','cc','
dd'                                      #问题数据''之间存在换行
      '20120520','ee','dd','ff','gg'     #正常数据
      '20120520','dd','ef','rr','        #问题数据''之间存在换行
gg'                                       

处理为:'20120520','aa','bb','cc','dd'
       '20120520','ee','dd','ff','gg'
       '20120520','dd','ef','rr','gg'
需要
1)两个单引号外的换行符要保留,2)两个单引号内的换行符要去掉
也可以理解为,文件中除了第一行外,文件中其他行,若不是以'开头就把它合并到上一行中。
补充:看了下数据,也存在'开头,非法的数据,只能根据''对数判断了。

perl水平太菜,没写出来。请高手,帮助下,谢谢。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
2 [报告]
发表于 2012-05-31 15:56 |只看该作者
  1. #!/usr/bin/env perl
  2. #

  3. use strict;
  4. use warnings;

  5. my $last;

  6. while (<DATA>) {
  7.     s/^\s+//g;
  8.     if (/^'/) {
  9.         print $last if $last;
  10.         $last = $_;
  11.     }
  12.     else {
  13.         chomp $last;
  14.         $last .= $_;
  15.     }
  16. }
  17. print $last;


  18. __DATA__
  19. '20120520','aa','bb','cc','
  20.     dd'
  21. '20120520','ee','dd','ff','gg'
  22. '20120520','dd','ef','rr','
  23.   gg'
复制代码

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
3 [报告]
发表于 2012-05-31 16:06 |只看该作者
  1. #!/usr/bin/env perl
  2. #

  3. use strict;
  4. use warnings;

  5. my $last;

  6. while (<DATA>) {
  7.     s/^\s+//g;
  8.     next if !$_;
  9.     if (/^'/) {
  10.         print $last if $last;
  11.         $last = $_;
  12.     }
  13.     else {
  14.         chomp $last;
  15.         $last .= $_;
  16.     }
  17. }
  18. print $last if $last;


  19. __DATA__
  20. '20120520','aa','bb','cc','
  21.     dd'

  22. '20120520','ee','dd','ff','gg'
  23. '20120520','dd','ef','rr','
  24.   gg'
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-05-31 18:19 |只看该作者
本帖最后由 kk861123 于 2012-05-31 18:20 编辑

回复 1# nulijq


    看看最后加的两行数据是不是你说的意思?
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. {
  5.     local $/;
  6.     my $str = <DATA>;
  7.     $str =~ s/^\s+//mg;
  8.     $str =~ s/(['] [^']*? ['])/ remove_carriage_return($1) /xeg;
  9.     print "$str";
  10. }
  11. sub remove_carriage_return {
  12.     my $get = shift;
  13.     $get =~ s/\n//g;
  14.     return $get;
  15. }

  16. __DATA__
  17. '20120520','aa','bb','cc','
  18. dd'
  19.       '20120520','ee','dd','ff','gg'
  20.       '20120520','dd','ef','rr','
  21. gg'
  22.       '20120520','dd','ef','rr','aa
  23. '
  24.       '20120520','ee','dd','ff','gg'
复制代码

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
5 [报告]
发表于 2012-05-31 20:48 来自手机 |只看该作者
s/\n//g; s/'2012/\n'2012/g;

论坛徽章:
0
6 [报告]
发表于 2012-05-31 20:59 |只看该作者
请问3楼next if !$_;#么司作用?#实在是妙!
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. my $last;
  5. while (<DATA>) {
  6.     s/^\s+//g;
  7.     next if !$_;#实在是妙!
  8.     if (/^'/&&/^'\N/) {
  9.         print $last if $last;
  10.         $last = $_;
  11.     }
  12.     elsif (/^'\n/)
  13.               {
  14.                 chomp;
  15.                 chomp $last;
  16.         $last .= $_;
  17.           }               
  18.         else {
  19.         chomp $last;
  20.         $last .= $_;
  21.       }
  22. }
  23. print $last if $last;


  24. __DATA__
  25. '20120520','aa','bb','cc','
  26. dd'
  27.       '20120520','ee','dd','ff','gg'
  28.       '20120520','dd','ef','rr','
  29. gg'
  30.       '20120520','dd','ef','rr','aa
  31. '
  32. XX'

  33.       '20120520','ee','dd','ff','gg'
  34.           '
  35.           YY
  36.           '
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-05-31 23:24 |只看该作者
本帖最后由 Perlvim 于 2012-06-01 23:10 编辑

s/,'$\n/,'/xmsg;

论坛徽章:
0
8 [报告]
发表于 2012-06-01 14:49 |只看该作者
谢谢,各位的程序了,我试试。

论坛徽章:
0
9 [报告]
发表于 2012-06-01 15:13 |只看该作者
回复 4# kk861123


    你好!谢谢你的帮助。我文件里面的数据形式就是这个样子的,试了试,符合要求:
   我的源文件为.csv的文件,如何修改这个文件呢,修改为处理过的规整信息
   如问题文件名为  MSC_201205.csv,试着写了下,发现源文件的内容没有修改。

论坛徽章:
0
10 [报告]
发表于 2012-06-01 16:16 |只看该作者
nulijq 发表于 2012-06-01 15:13
回复 4# kk861123

我建议你还是从“MSC_201205.csv”文件中读取,再重新写入其他文件吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP