标题: [问题求助] Perl怎样把一个文件中的内容行列互置? [打印本页]
作者: DAIC 时间: 2011-6-11 01:32 标题: Perl怎样把一个文件中的内容行列互置?
原文件a.txt:
希望得到的结果:
作者: chenqldiy 时间: 2011-6-11 02:42
Perl?这个,你问错地方了把?
作者: DAIC 时间: 2011-6-11 09:46
这里不就是Perl版块吗,不在这里,那该去哪儿呀?!
我发现这个论坛里面思维诡异的人还真是不少呢!
作者: 523066680 时间: 2011-6-11 10:41
这里不就是Perl版块吗,不在这里,那该去哪儿呀?!
我发现这个论坛里面思维诡异的人还真是不少呢!
DAIC 发表于 2011-6-11 09:46
那个人可能刚来…… 不管…… 做题ing
作者: Demon 时间: 2011-6-11 10:51
那个人可能刚来…… 不管…… 做题ing
523066680 发表于 2011-6-11 10:41
恩,我也刚来。
作者: 523066680 时间: 2011-6-11 10:51
本帖最后由 523066680 于 2011-6-11 11:06 编辑
空格要切分吗 ,我按逐字符处理了- open READ,"<src.txt";
- foreach (<READ>) {
- $n=0;
- for $i (0..(length($_)-1)) {
- $arr[$n++].=substr($_,$i,1);
- }
- }
- close READ;
- foreach (@arr) {
- print "$_ \n";
- }
- <STDIN>;
复制代码
输出结果
作者: 523066680 时间: 2011-6-11 10:52
恩,我也刚来。
Demon 发表于 2011-6-11 10:51
你怎么现在才来
作者: DAIC 时间: 2011-6-11 13:54
6# 523066680
你这样处理之后就变成1列了,不是我希望的结果。
作者: sxw 时间: 2011-6-11 15:02
这个好像是chinaunix上的,有人问过,贴过来了(我忘了原帖在哪了,抱歉)- my @matrix;
- my $max_len = 0;
- while(<DATA>){
- chomp;
- my @fields = split / /, $_;
- my $len = @fields;
- $max_len = $max_len > $len ? $max_len : $len;
- push @matrix, [@fields];
- }
- for my $col (0..$max_len - 1){
- for my $line (@matrix){
- print $line->[$col]." "|| ' ';
- }
- print "\n";
- }
- __DATA__
- 1 2 3
- a b c
复制代码
作者: DAIC 时间: 2011-6-11 15:14
9# sxw
非常感谢!
看来你们地球上除了那一两个人之外,还是有其他人会Perl的的,我很欣慰。
作者: 523066680 时间: 2011-6-11 15:21
本帖最后由 523066680 于 2011-6-11 15:22 编辑
6# 523066680
你这样处理之后就变成1列了,不是我希望的结果。
DAIC 发表于 2011-6-11 13:54
哈 ,叠加的时候增加一个空格,就两列了。看样子这位是纯粹出题,不投入啊。
作者: Demon 时间: 2011-6-11 15:25
哈 ,叠加的时候增加一个空格,就两列了。看样子这位是纯粹出题,不投入啊。
523066680 发表于 2011-6-11 15:21
我看根本就是什么都不懂嘛
作者: 523066680 时间: 2011-6-11 15:39
本帖最后由 523066680 于 2011-6-11 16:54 编辑
我看根本就是什么都不懂嘛
Demon 发表于 2011-6-11 15:25
呀哈,作为一名外贸人员,这点业余消遣,别人认为懂不懂无所谓啦~
(这句替换掉了。他人引用的内容无法替换,就成为心浮气躁的证据吧。)- open READ,"<src.txt";
- foreach (<READ>) {
- $n=0;
- for $i (0..(length($_)-1)) {
- if (substr($_,$i,1) ne " ") {
- $arr[$n++].=substr($_,$i,1)." ";
- }
- }
- }
- close READ;
- foreach (@arr) {
- print "$_\n";
- }
- <STDIN>;
复制代码
作者: Demon 时间: 2011-6-11 15:46
呀哈,作为一名外贸人员,这点业余消遣,别人认为懂不懂无所谓啦~
你月薪多少啊?能人,很能说会道啊。 你跟bccn那个挑衅的,没法比。
523066680 发表于 2011-6-11 15:39
你先搞清楚我在说谁好么。
作者: DAIC 时间: 2011-6-11 16:40
11# 523066680
我是初学者,别跟我一般见识呀。
不过你的方法不能处理这种情况:
1 1 1
22 22 22
作者: 523066680 时间: 2011-6-11 16:45
本帖最后由 523066680 于 2011-6-11 17:12 编辑
11# 523066680
我是初学者,别跟我一般见识呀。
不过你的方法不能处理这种情况:
1 1 1
22 22 22
DAIC 发表于 2011-6-11 16:40
那就是按空格作为"字符串"分隔啦 俺学习下sxw的答案- $n=0;
- $big=0;
- foreach (<DATA>) {
- @{$arr[$n]}=split(" ",$_);
- $big = $#{$arr[$n]} > $big ? $#{$arr[$n]} : $big;
- $n++;
- }
- foreach $j (0..$big) {
- foreach $i (0..$#arr) {
- print "$arr[$i][$j] ";
- }
- print "\n";
- }
- <STDIN>;
-
- __DATA__
- 1 2 3 4
- a b c dd
复制代码
没有考虑参差不齐的情况
作者: sxw 时间: 2011-6-12 10:02
如果处理的是中文呢?比如:- 将进酒—李白
- 君不见,黄河之水天上来,奔流到海不复回。
- 君不见,高堂明镜悲白发,朝如青丝暮成雪。
- 人生得意须尽欢,莫使金樽空对月。
- 天生我材必有用,千金散尽还复来。
- 烹羊宰牛且为乐,会须一饮三百杯。
- 岑夫子,丹丘生,将进酒,杯莫停。
- 与君歌一曲,请君为我侧耳听:
- 钟鼓馔玉不足贵,但愿长醉不复醒。
- 古来圣贤皆寂寞,唯有饮者留其名。
- 陈王昔时宴平乐,斗酒十千恣欢谑。
- 主人何为言少钱,径须沽取对君酌。
- 五花马,千金裘,呼儿将出换美酒,
- 与尔同销万古愁。
复制代码
作者: 523066680 时间: 2011-6-12 14:59
本帖最后由 523066680 于 2011-6-12 15:19 编辑
不在乎代码长度了,做了看看先
环境:perl, v5.10.1 built for MSWin32-x86-multi-thread
该脚本保存后,另存,选UTF-8文本格式 否则输出乱码
(我对编码处理还是很菜的)- use Encode;
- open WRITE,">result.x";
- $L=0;
- $big=0;
- foreach (<DATA>) {
- chomp;
- Encode::_utf8_on($_);
- $big=(length($_)-1)>$big? (length($_)-1):$big;
- for $i (0..(length($_)-1)) {
- $arr[$L][$i]=substr($_,$i,1);
- }
- $L++;
- }
- foreach $j (0..$big) {
- foreach $i (0..($L-1)) {
- if (! defined $arr[$i][$j]) {
- print WRITE " ";
- } else {
- print WRITE "$arr[$i][$j]";
- }
- }
- print WRITE "\n";
- }
- print "Press ENTER to quit\n";
- <STDIN>;
- __DATA__
- 将进酒—李白
- 君不见,黄河之水天上来,奔流到海不复回。
- 君不见,高堂明镜悲白发,朝如青丝暮成雪。
- 人生得意须尽欢,莫使金樽空对月。
- 天生我材必有用,千金散尽还复来。
- 烹羊宰牛且为乐,会须一饮三百杯。
- 岑夫子,丹丘生,将进酒,杯莫停。
- 与君歌一曲,请君为我侧耳听:
- 钟鼓馔玉不足贵,但愿长醉不复醒。
- 古来圣贤皆寂寞,唯有饮者留其名。
- 陈王昔时宴平乐,斗酒十千恣欢谑。
- 主人何为言少钱,径须沽取对君酌。
- 五花马,千金裘,呼儿将出换美酒,
- 与尔同销万古愁。
复制代码
君君人天烹岑与钟古陈主五与
不不生生羊夫君鼓来王人花尔
见见得我宰子歌馔圣昔何马同
,,意材牛,一玉贤时为,销
黄高须必且丹曲不皆宴言千万
将河堂尽有为丘,足寂平少金古
进之明欢用乐生请贵寞乐钱裘愁
酒水镜,,,,君,,,,,。
—天悲莫千会将为但唯斗径呼
李上白使金须进我愿有酒须儿
白来发金散一酒侧长饮十沽将
,,樽尽饮,耳醉者千取出
奔朝空还三杯听不留恣对换
流如对复百莫:复其欢君美
到青月来杯停 醒名谑酌酒
海丝。。。。 。。。。,
不暮
复成
回雪
。。
作者: 523066680 时间: 2011-6-12 15:15
引用资料:源代码里的字符串的utf8 flag同样是关闭的状态.
假如你的源代码里含有中文, 那么你最好遵循这个原则: 1) 编写代码时使用utf8编码, 2)在文件的开头加上use utf8;语句. 这样, 你源代码里的字符串就都会是utf8编码的, 并且utf8 flag也已经打开.
3) 从文件读入. 这个毫无疑问, 你的文件是什么编码, 读进来就是什么编码了. 读进来以后, utf8 flag是off状态.
上楼的代码中 use Encode; 和 Encode::_utf8_on($_); 去掉
在开头 使用use utf8; 也可以。
作者: DAIC 时间: 2011-6-12 15:25
18# 523066680
这个有意思,怎样才能向古书那样从上向下、从右向左呢?
作者: 523066680 时间: 2011-6-12 15:51
本帖最后由 523066680 于 2011-6-12 16:14 编辑
反正是把文字一个个的存入行列式了,进了数组,爱怎么调换就怎么调换。
我这里倒是遇到一个奇怪的问题:
假如前面的代码不是读自身的__DATA__而是读取外部的一个utf-8编码的文本,
open READ,"<source.txt";
输出结果却是(注意将进酒标题 被往下推了一行):
君君人天烹岑与钟古陈主五与
不不生生羊夫君鼓来王人花尔
见见得我宰子歌馔圣昔何马同
,,意材牛,一玉贤时为,销
黄高须必且丹曲不皆宴言千万
河堂尽有为丘,足寂平少金古
将之明欢用乐生请贵寞乐钱裘愁
进水镜,,,,君,,,,,。
酒天悲莫千会将为但唯斗径呼
—上白使金须进我愿有酒须儿
李来发金散一酒侧长饮十沽将
白,,樽尽饮,耳醉者千取出
奔朝空还三杯听不留恣对换
流如对复百莫:复其欢君美
到青月来杯停 醒名谑酌酒
海丝。。。。 。。。。,
不暮
复成
回雪
。。
第一个字符编码好像改变了,看不见,但是判断又非空。 纳闷
=================================
找到了相关文章:
Ant编译utf-8非法字符:\65279 解决方法
http://blog.csdn.net/xiyuan1999/archive/2010/11/05/5989336.aspx
一般用UE或记事本编辑过的UTF-8的文件头会加入BOM标识,该标识由3个char组成。在 UTF-8的标准里该BOM标识是可有可无的
内牛满面的说,今天有收获,知道了这个有点坑人的东西。
作者: sxw 时间: 2011-6-12 16:28
学习一下523066680版主的代码,哈哈- use Encode;
- $n=0;
- $big=0;
- foreach (<DATA>) {
- chomp;
- $_=decode ("gb2312",$_);
- @{$arr[$n]}=split(//,$_);
- $big = $#{$arr[$n]} > $big ? $#{$arr[$n]} : $big;
- $n++;
- }
- foreach $j (0..$big) {
- foreach $i (reverse 0..$#arr) {
- printf("|%s", encode("gb2312",$arr[$i][$j])||' ');
- }
- print "\n";
- }
- __DATA__
- 将进酒/李白
- 君不见,黄河之水天上来,奔流到海不复回。
- 君不见,高堂明镜悲白发,朝如青丝暮成雪。
- 人生得意须尽欢,莫使金樽空对月。
- 天生我材必有用,千金散尽还复来。
- 烹羊宰牛且为乐,会须一饮三百杯。
- 岑夫子,丹丘生,将进酒,杯莫停。
- 与君歌一曲,请君为我侧耳听:
- 钟鼓馔玉不足贵,但愿长醉不复醒。
- 古来圣贤皆寂寞,唯有饮者留其名。
- 陈王昔时宴平乐,斗酒十千恣欢谑。
- 主人何为言少钱,径须沽取对君酌。
- 五花马,千金裘,呼儿将出换美酒,
- 与尔同销万古愁。
复制代码
作者: 523066680 时间: 2011-6-12 16:35
本帖最后由 523066680 于 2011-6-12 16:39 编辑
明显比我的代码短很多啊
$arr[$i][$j])||' ' 仔细一看,用 || 真省事,没想到。
作者: sxw 时间: 2011-6-12 16:38
20# DAIC
用reverse操作符啊
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |