+ -
当前位置:首页 → 问答吧 → Perl 文件修改求教, 不胜感激

Perl 文件修改求教, 不胜感激

时间:2010-07-28

来源:互联网

本帖最后由 xlli000 于 2010-07-28 13:12 编辑

想对文件作如下修改,具体信息如下, 求教高手如何实现。
文件很大,下面只是一个例子。

解释下,就是把每列上把开始变化的a用b替换,只是在变化点a。不知道perl有没有办法对文件进行列操作,本人刚刚开始学习Perl。


文件a.txt内容如下

1 1 1 1 1 1 1 0 a a a
1 1 1 1 1 1 1 0 a a a
1 1 1 1 1 1 1 0 a a a
1 1 1 1 a 1 1 0 a a a
1 1 1 a a a a a a a a
1 1 1 a a a a a a a a
1 0 0 a a a a a a a a
1 0 0 a 0 a a a a a a
1 0 0 0 0 0 0 0 a a a
1 0 0 0 0 0 0 0 a a a
1 0 0 0 0 0 0 0 a a a
1 0 0 0 0 0 0 0 1 1 a
1 0 0 0 0 0 0 0 1 1 a



修改后文件内容如下:
1 1 1 1 1 1 1 0 a a a
1 1 1 1 1 1 1 0 a a a
1 1 1 1 1 1 1 0 a a a
1 1 1 1 b 1 1 0 a a a
1 1 1 b a b b b a a a
1 1 1 a a a a a a a a
1 0 0 a b a a a a a a
1 0 0 b 0 b b b a a a
1 0 0 0 0 0 0 0 a a a
1 0 0 0 0 0 0 0 a a a
1 0 0 0 0 0 0 0 b b a
1 0 0 0 0 0 0 0 1 1 a
1 0 0 0 0 0 0 0 1 1 a


试着写了段,还没有试验,要晚上回家确认下,本人新手,请高手帮忙看看哪里有问题,另外这样可能会很慢,因为真实文件很大,2G左右,所以如何提高效率,有没有办法进行列操作。

use File::Copy;                                                                             
require "GetCurrentPath.pl";                                                               
                                                                                            
$FilePath="C:/Perl/Script";                                                                 
$FileName="try.atp";                                                                        
#$LocalPath2="C:/Perl/Script/FinalPath";                                                   
$current_path=GetCurrentPath;                                                               
                                                                                            
#--------------------------------- Begin Main -------------------------------               
#print "$current_path\n";                                                                  
                                                                                            
#$BaseStrip =length($LocalPath);                                                            
                                                                                            
                                                                                            
open (LogFile, "+<$FilePath/$FileName" ) || die "No file open\n";                           
                                                              
                                                                                            
@fname = <LogFile>;                                                                        
                                                                                            
$line=scalar@fname;                                                                        
                                                                                            
for ($i=1;$i<=$line;$i=$i+1)                                                               
{                                                                                          
        @linefname=split / /,$fname[$i];                                                         
        @pre_linefname=split / /,$fname[$i-1];                                                   
        @post_linefname=split / /,$fname[$i+1];                                                   
                                                                                                 
        $row=scalar@linefname;                                                                    
                                                                                                 
        $line_flag=T                                                                              
                                                                                                 
        for ($j=1;$j<=$row;$j=$j+1)                                                               
        {                                                                                         
                if($linefname[$j]=~/a/ && (pre_linefname[$j]=!~/a/ || post_linefname[$j]=!~/a/) )      
                {                                                                                       
                        $linefname[$j]=b;                                                                                                          
                }                                                                                       
        }                                                                                         
}                                                                                          
                                                                                            
                                                                                            
print "fname is opened\n";                                                                  
close (LogFile);

作者: xlli000   发布时间: 2010-07-28

能把修改的特点说清楚一点么,这么样放在这里怎么帮你实现啊

作者: weikun750   发布时间: 2010-07-28



QUOTE:
能把修改的特点说清楚一点么,这么样放在这里怎么帮你实现啊
weikun750 发表于 2010-07-28 12:40




    就是把同列上开始变化的a用b替换,只是在变化点。不知道perl有没有办法对文件进行列操作,刚刚开始学习Perl。
另外如果用行的话,需要循环嵌套,不知道可不可以。

作者: xlli000   发布时间: 2010-07-28

另外文件很大,有2G大小,所以如果用两次循环,可能会很慢,不知道有没有效率的方法。
现在在公司,电脑上还不能安装Perl,回家才能继续试验。

作者: xlli000   发布时间: 2010-07-28