Chinaunix

标题: 求perl脚本程序 [打印本页]

作者: nulijq    时间: 2012-05-31 15:34
标题: 求perl脚本程序
本帖最后由 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水平太菜,没写出来。请高手,帮助下,谢谢。
作者: cdtits    时间: 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'
复制代码

作者: cdtits    时间: 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'
复制代码

作者: kk861123    时间: 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'
复制代码

作者: RE_HASH    时间: 2012-05-31 20:48
s/\n//g; s/'2012/\n'2012/g;
作者: tempo8    时间: 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.           '
复制代码

作者: Perlvim    时间: 2012-05-31 23:24
本帖最后由 Perlvim 于 2012-06-01 23:10 编辑

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


作者: nulijq    时间: 2012-06-01 14:49
谢谢,各位的程序了,我试试。
作者: nulijq    时间: 2012-06-01 15:13
回复 4# kk861123


    你好!谢谢你的帮助。我文件里面的数据形式就是这个样子的,试了试,符合要求:
   我的源文件为.csv的文件,如何修改这个文件呢,修改为处理过的规整信息
   如问题文件名为  MSC_201205.csv,试着写了下,发现源文件的内容没有修改。
作者: kk861123    时间: 2012-06-01 16:16
nulijq 发表于 2012-06-01 15:13
回复 4# kk861123

我建议你还是从“MSC_201205.csv”文件中读取,再重新写入其他文件吧




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2