用perl对文本的列进行处理的问题

30 views
Skip to first unread message

Li Xiangchen

unread,
May 15, 2013, 5:39:20 AM5/15/13
to perl...@googlegroups.com
我有一个文本,里面数据是这样:
0.924
0.609
0.742
0.808
0.832
0.866
0.61
0.584
0.854
0.91
0.863
0.706
0.925
0.719
0.828
0.701
0.761
0.795
0.717
0.7
0.968
0.604
0.751
0.825
0.844
0.863
0.621
0.568
0.876
0.917
...
我想没隔20行,提取一组数据,然后把文本变成如下形式的:
0.924 0.968 0.712 0.911 0.939
0.609 0.604 0.685 0.873 0.912
0.742 0.751 0.633 0.561 0.581
0.808 0.825 0.678 0.807 0.744
0.832 0.844 0.654 0.763 0.831
0.866 0.863 0.676 0.842 0.847
0.61 0.621 0.569 0.597 0.609
0.584 0.568 0.508 0.577 0.538
0.854 0.876 0.685 0.769 0.84
0.91 0.917 0.725 0.862 0.908
0.863 0.868 0.663 0.803 0.867
0.706 0.709 0.589 0.647 0.695
0.925 0.923 0.737 0.863 0.91
0.719 0.712 0.639 0.72 0.688
0.828 0.835 0.644 0.775 0.835
0.701 0.713 0.594 0.609 0.695
0.761 0.776 0.644 0.739 0.767
0.795 0.807 0.65 0.733 0.822
0.717 0.747 0.579 0.641 0.676
0.7 0.721 0.586 0.646 0.662
这样的每20行数据为一列,中间以制表符隔开的形式,但苦于刚学Perl不太会写程序操作,还请朋友帮忙,谢谢!
--
使用Opera的电子邮件客户端:http://www.opera.com/mail/

Roger chen

unread,
May 15, 2013, 6:03:27 AM5/15/13
to perl...@googlegroups.com
先搞成每行20个,然后作矩阵转换(如果不是经常用或许excel就可以实现行列互
换。,

-----邮件原件-----
发件人: perl...@googlegroups.com [mailto:perl...@googlegroups.com] 代表
Li Xiangchen
发送时间: 2013年5月15日 17:39
收件人: perl...@googlegroups.com
主题: [PerlChina] 用perl对文本的列进行处理的问题
--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论
坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到
perlchina+...@googlegroups.com
要向此网上论坛发帖,请发送电子邮件至 perl...@googlegroups.com
通过以下网址访问此论坛:http://groups.google.com/group/perlchina?hl=zh-CN
要查看更多选项,请访问 https://groups.google.com/groups/opt_out


Roger chen

unread,
May 15, 2013, 6:46:41 AM5/15/13
to perl...@googlegroups.com
写一个每行3个的,你可以调一下看看。
while (<>){
chomp ;
push @a,$_;
}
$a=($#a+1)/3;
for $x (0..$a){
for $y (0..2){
print "$a[$x*3+$y]\t";
}
print "\n";
}



0.924 0.609 0.742
0.808 0.832 0.866
0.61 0.584 0.854
0.91 0.863 0.706
0.925 0.719 0.828
0.701 0.761 0.795
0.717 0.7 0.968
0.604 0.751 0.825
0.844 0.863 0.621
0.568 0.876 0.917

-----邮件原件-----
发件人: perl...@googlegroups.com [mailto:perl...@googlegroups.com] 代表
Li Xiangchen
发送时间: 2013年5月15日 17:39
收件人: perl...@googlegroups.com
主题: [PerlChina] 用perl对文本的列进行处理的问题

cheung mc

unread,
May 15, 2013, 7:03:58 AM5/15/13
to perl...@googlegroups.com
test.pl
PastedGraphic-1.tiff

夏凯

unread,
May 15, 2013, 7:09:31 AM5/15/13
to perl...@googlegroups.com
On 2013年05月15日 17:39, Li Xiangchen wrote:
> 这样的每20行数据为一列,中间以制表符隔开的形式,但苦于刚学Perl不太会写
> 程序操作,还请朋友帮忙,谢谢!
一个hash,然后每次写入a[i" "j],i是行数-1除以20的余数,j是行数-1除以20的
结果,然后最后只要两个for循环把这个散列打印出来就行了。
比如数据是1-6,然后变成三行
a[0" "0]=1
a[1" "0]=2
a[2" "0]=3
a[0" "1]=4
a[1" "1]=5
a[2" "1]=6
for(i=0;i<2;i++)for(j=0;j<=col;j++),这样打印出来就是
1 4
2 5
3 6

兴陆 林

unread,
May 15, 2013, 7:14:19 AM5/15/13
to perl...@googlegroups.com
好像也可以用 format 实现。

__END__
{
 $name = '林兴陆(@小林)';
 $qq = 28888888;
 $mail = 'i...@lxl.cn';
 @tel = (1860135041013501281365);
 %url = (
  'website' => "http://www.yes123.com",
  'homepage' => "http://linxinglu.com"
 );
 # 信恩科技: 移动学习 寓教于乐
}

夏凯

unread,
May 15, 2013, 7:29:53 AM5/15/13
to perl...@googlegroups.com
On 2013年05月15日 19:14, 兴陆 林 wrote:
> 好像也可以用 format 实现。
这个我不清楚,其实我不懂perl,我只是给出一个算法,所有语言都能这样实现。

李相辰

unread,
May 15, 2013, 7:44:46 AM5/15/13
to perlchina
非常感谢,您的回复给予我很大的帮助!


2013/5/15 cheung mc <alabo...@gmail.com>

Anthony WU

unread,
May 15, 2013, 8:04:30 AM5/15/13
to perl...@googlegroups.com
use POSIX qw/ceil/;
@line = <>;
chomp (@line);
print join ("\t", @line[$_ * 20 .. $_ * 20 + 20]) . "\n" for
(0..ceil($#line/20));
> ����û��20�У���ȡһ����ݣ�Ȼ����ı����������ʽ�ģ�
> 0.924 0.968 0.712 0.911 0.939
> 0.609 0.604 0.685 0.873 0.912
> 0.742 0.751 0.633 0.561 0.581
> 0.808 0.825 0.678 0.807 0.744
> 0.832 0.844 0.654 0.763 0.831
> 0.866 0.863 0.676 0.842 0.847
> 0.61 0.621 0.569 0.597 0.609
> 0.584 0.568 0.508 0.577 0.538
> 0.854 0.876 0.685 0.769 0.84
> 0.91 0.917 0.725 0.862 0.908
> 0.863 0.868 0.663 0.803 0.867
> 0.706 0.709 0.589 0.647 0.695
> 0.925 0.923 0.737 0.863 0.91
> 0.719 0.712 0.639 0.72 0.688
> 0.828 0.835 0.644 0.775 0.835
> 0.701 0.713 0.594 0.609 0.695
> 0.761 0.776 0.644 0.739 0.767
> 0.795 0.807 0.65 0.733 0.822
> 0.717 0.747 0.579 0.641 0.676
> 0.7 0.721 0.586 0.646 0.662
> �����ÿ20�����Ϊһ�У��м����Ʊ���������ʽ�������ڸ�ѧPerl��̫��д
> ����������������Ѱ�æ��лл��

夏凯

unread,
May 15, 2013, 8:25:05 AM5/15/13
to perl...@googlegroups.com
On 2013年05月15日 20:04, Anthony WU wrote:
> use POSIX qw/ceil/;
> @line = <>;
> chomp (@line);
> print join ("\t", @line[$_ * 20 .. $_ * 20 + 20]) . "\n" for
> (0..ceil($#line/20));
其实我想说一点,大家的热情是可以理解的,不过直接给代码很不好,授人以鱼不
如授人以渔,他又不是很紧急,应该让他自己去思考,给他思路就行了。
否则到时候一大堆简单的需求,要你们给出代码。

Roger

unread,
May 15, 2013, 9:11:00 AM5/15/13
to perl...@googlegroups.com
在理:-)

Sent from my Sony Xperia™ smartphone smartphone

夏凯 <walk...@gmail.com> wrote:

Li Xiangchen

unread,
May 15, 2013, 9:12:04 AM5/15/13
to perl...@googlegroups.com
您说的很对,谢谢~
在 Wed, 15 May 2013 21:11:00 +0800,Roger <jiron...@gmail.com> 写道:

> 在理:-)
>
> Sent from my Sony Xperia(tm) smartphone smartphone
--
使用Opera的电子邮件客户端:http://www.opera.com/mail/

Hao Wu

unread,
May 15, 2013, 9:35:55 AM5/15/13
to perl...@googlegroups.com
如果不介意用其他的模块,类似的可以用,
Tie::Array::CSV
http://blogs.perl.org/users/joel_berger/2012/02/why-would-i-use-tiearraycsv.html

免去IO的麻烦,直接当作二维数组来操作。

2013/5/15 Li Xiangchen <lixian...@gmail.com>
您说的很对,谢谢~
在 Wed, 15 May 2013 21:11:00 +0800,Roger <jiron...@gmail.com> 写道:
在理:-)

Sent from my Sony Xperia(tm) smartphone smartphone

夏凯 <walk...@gmail.com> wrote:

On 2013年05月15日 20:04, Anthony WU wrote:
use POSIX qw/ceil/;
@line = <>;
chomp (@line);
print join ("\t", @line[$_ * 20 .. $_ * 20 + 20]) . "\n" for
(0..ceil($#line/20));
其实我想说一点,大家的热情是可以理解的,不过直接给代码很不好,授人以鱼不
如授人以渔,他又不是很紧急,应该让他自己去思考,给他思路就行了。
否则到时候一大堆简单的需求,要你们给出代码。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 perlchina+unsubscribe@googlegroups.com

要向此网上论坛发帖,请发送电子邮件至 perl...@googlegroups.com
通过以下网址访问此论坛:http://groups.google.com/group/perlchina?hl=zh-CN
要查看更多选项,请访问 https://groups.google.com/groups/opt_out





--
使用Opera的电子邮件客户端:http://www.opera.com/mail/


--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 perlchina+unsubscribe@googlegroups.com
Reply all
Reply to author
Forward
0 new messages