免费注册 查看新帖 |

Chinaunix

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

请大家帮忙看看我这段程序运行后,怎么会丢失一行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-06 08:17 |只看该作者 |倒序浏览
有两个文件,程序目的是替换A文件中的第一个字段的同时,替换B文件中的相同字段.
文件A:
a1|kajlkj|ksjlfk|skfjls|23
a2|ljkj|skjk|24234|33
......

文件B:
b1|llkl3|c1|lkll|k9ii|234223|a1|44
b2|klkll|a1|................|c1|sf.
b3|.....|d1|................|e1|
b4|.....|a2|................|d1|
b5|.....|d2|................|a2|
....

我的方法是:

  1. open(FHA1,"A");
  2. open(FHA2,">A.txt");
  3. open(FHB1,"B");
  4. open(FHB2,">B.txt");
  5. $data = 50000;
  6. while($lineA = <FHA1>){
  7.         chomp $lineA;
  8.         ($field1,$field2,$field3,$field4,$field5) = split(/\|/,$lineA,5);
  9.         seek(FHB1,0,0);
  10.         while($lineB = <FHB1>){
  11.                 chomp $lineB;
  12.                 ( $value1,$value2,$value3,$value4,$value5,$value6,$value7,$value8 ) = split( /\|/,$lineB,8 );
  13.                 if($value3 == $field1){
  14.                         $value3 = $data;
  15.                         $lineB = join('|',$value1,$value2,$value3,$value4,$value5,$value6,$value7);
  16.                         print FHB2 $lineB,"\n";
  17.                 }
  18.                 elsif($value7 == $field1){
  19.                         $value7 = $data;
  20.                         $lineB = join('|',$value1,$value2,$value3,$value4,$value5,$value6,$value7);
  21.                         print FHB2 $lineB,"\n";                                       
  22.                 }
  23.         }
  24.         $field1 = $data++;
  25.         $lineA = join('|',$field1,$field2,$field3,$field4,$field5);
  26.         print FHA2 $lineA,"\n";
  27. }
  28. close(FHA1);
  29. close(FHA2);
  30. close(FHB1);
  31. close(FHB2);
复制代码

可是这样做的运行的结果是,类似文件B中第三行,在写到B.txt文件中时就会丢失;
请问这种情况处理?

[ 本帖最后由 nv2test 于 2006-7-6 09:57 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-07-06 20:44 |只看该作者

回复 1楼 nv2test 的帖子

Hallo,

tips and tricks:
To make programming easy and clearly.
don't open many file handler and process data at same time.
Firstly load data from file and put it in a data structure (i.e. an array).
Processing different data together to make new data structure and then write them
into new files.

Sample code:

  1. use strict;

  2. open FA, 'A.txt';
  3. my @a_lines = <FA>;
  4. close FA;

  5. open FB, 'B.txt';
  6. my @b_lines = <FB>;
  7. close FB;

  8. my $update = 9999; # change value for all first field in file A
  9. my @new_a = ();
  10. my @new_b = ();

  11. foreach my $a_line (@a_lines) {
  12.     chomp $a_line;
  13.     my @a_tmp = split /\|/, $a_line, -1;
  14.     my $a_field_1 = $a_tmp[0];
  15.     my $cnt_b = 0;
  16.     foreach my $b_line (@b_lines) {
  17.         chomp $b_line;
  18.         my @b_tmp_new = ();
  19.         for my $b_item (split /\|/, $b_line, -1) {
  20.             # mapping new B
  21.             if ($b_item eq $a_field_1) {
  22.                 push @b_tmp_new, $update;
  23.             } else {
  24.                 push @b_tmp_new, $b_item;
  25.             }
  26.         }
  27.         $new_b[$cnt_b] = join '|', @b_tmp_new;
  28.         $cnt_b++;
  29.     }
  30.     # mapping new A
  31.     $a_tmp[0] = $update;
  32.     push @new_a, join '|', @a_tmp;
  33. }

  34. # debug:
  35. print "A:\n", @a_lines;
  36. print "B:\n", @b_lines;
  37. print "\nNew A: \n", join "\n", @new_a;  # write it in new A file
  38. print "\nNew B: \n", join "\n", @new_b;  # write it in new B file
  39. print "\n";
  40. # :~)

复制代码


Best,
    ulmer

-----
Just for Fun

论坛徽章:
0
3 [报告]
发表于 2006-07-10 08:47 |只看该作者
非常感谢umler!!
首先需要说明的是,我是个PERL的初学者,你回复的代码,我研究了差不多4个小时的时间,终于读懂了.从你的回复中,我学到了很多,真的!!

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP