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
#!/usr/bin/env perl
#
use strict;
use warnings;
my $last;
while (<DATA>) {
s/^\s+//g;
if (/^'/) {
print $last if $last;
$last = $_;
}
else {
chomp $last;
$last .= $_;
}
}
print $last;
__DATA__
'20120520','aa','bb','cc','
dd'
'20120520','ee','dd','ff','gg'
'20120520','dd','ef','rr','
gg'
复制代码
作者:
cdtits
时间:
2012-05-31 16:06
#!/usr/bin/env perl
#
use strict;
use warnings;
my $last;
while (<DATA>) {
s/^\s+//g;
next if !$_;
if (/^'/) {
print $last if $last;
$last = $_;
}
else {
chomp $last;
$last .= $_;
}
}
print $last if $last;
__DATA__
'20120520','aa','bb','cc','
dd'
'20120520','ee','dd','ff','gg'
'20120520','dd','ef','rr','
gg'
复制代码
作者:
kk861123
时间:
2012-05-31 18:19
本帖最后由 kk861123 于 2012-05-31 18:20 编辑
回复
1#
nulijq
看看最后加的两行数据是不是你说的意思?
#!/usr/bin/perl
use strict;
use warnings;
{
local $/;
my $str = <DATA>;
$str =~ s/^\s+//mg;
$str =~ s/(['] [^']*? ['])/ remove_carriage_return($1) /xeg;
print "$str";
}
sub remove_carriage_return {
my $get = shift;
$get =~ s/\n//g;
return $get;
}
__DATA__
'20120520','aa','bb','cc','
dd'
'20120520','ee','dd','ff','gg'
'20120520','dd','ef','rr','
gg'
'20120520','dd','ef','rr','aa
'
'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 !$_;#么司作用?#实在是妙!
#!/usr/bin/env perl
use strict;
use warnings;
my $last;
while (<DATA>) {
s/^\s+//g;
next if !$_;#实在是妙!
if (/^'/&&/^'\N/) {
print $last if $last;
$last = $_;
}
elsif (/^'\n/)
{
chomp;
chomp $last;
$last .= $_;
}
else {
chomp $last;
$last .= $_;
}
}
print $last if $last;
__DATA__
'20120520','aa','bb','cc','
dd'
'20120520','ee','dd','ff','gg'
'20120520','dd','ef','rr','
gg'
'20120520','dd','ef','rr','aa
'
XX'
'20120520','ee','dd','ff','gg'
'
YY
'
复制代码
作者:
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