2013-04-08 77 views
1

我是Perl新手,尝试理清问题但没有成功。我正在尝试从文本文件中读取数据。该代码是:在Perl中删除分隔符之间的空白和换行符

open FH, 'D:\Learning\Test.txt' or die $!; 
my @data_line; 
while (<FH>) 
{ 
@data_line = split (/\|\~/); 
print @data_line; 
} 

文件内容是这样的:

101|~John|~This line is 
broken and showing 
space in print|~version123|~data|~|~|~ 
102|~Abrahim|~This is a line to be print|~version1.3|~|~|~|~

,输出是:

101JohnThis line is  
broken and showing 
space in printversion123data 
102AbrahimThis is a line to be printversion1.3

我只是想表明在分隔符之间的一行数据如:

101JohnThis line is broken and showing space in printversion123data 
102AbrahimThis is a line to be printversion1.3

请指出指责我该怎么做。我也尝试chomp(@data_line),但它没有奏效。 我正在使用Windows操作系统。

我想在表格的不同字段中插入这些“|〜”分隔值。我添加了: $ _ =〜s/\ n // g; @data_line = split(/ \ | \〜/)之前的 ; 它按照我的要求打印了详细信息,但没有在我的数据库表中正确插入数据。 请问我该怎么办?提前致谢。

回答

0

你需要在分裂之前ch一下“it”变量。

while (<FH>) 
{ 
chomp ($_); 
@data_line = split (/\|\~/); 
print @data_line; 
} 

我通常使用显式变量使其更具可读性。

while (my $line= <FH>) 
{ 
    chomp ($line); 
    ... 
0
open FH, 'D:\Learning\Test.txt' or die $!; 
my @data_line; 
while (<FH>) 
{ 
chomp; 
@data_line = split (/\|\~/); 
print @data_line; 
} 

可以使用格格以删除文件 '/ N'。

+0

这个我试过,它不工作,但感谢答复 – user2255200 2013-04-09 14:53:10

0

这一个班轮将帮助你。但它会改变你的输入文件

perl -pi -e 's/\|\~//g;s/\n/ /g' test.txt 
+0

您好,我又增加了这样的事:$ _ =〜S/\ n //克; @arr = split(/ \ | \〜/);它在屏幕上输出正确的输出,但是如果我想将这些值插入数据库表中,它不能正确插入数据。 – user2255200 2013-04-09 14:48:51

1

略有改写:

use strict; 
use warnings; 
use feature qw(say);    #See note #1 

use autodie;      #See note #2 

use constant FILE => 'D:/Learning/Test.txt'; #See note #3 

open my $fh, "<", FILE;   #See note #4 
my $desired_output; 
while (my $line = <DATA>) {  #See note #5 
    chomp $line;     #See note #6 
    $line =~ s/\|~//g; 
    if ($desired_output) { 
     if ($line =~ /^\d+/) { 
      $desired_output .= "\n$line"; 
     } 
     else { 
      $desired_output .= " $line"; 
     } 
    } 
    else {       #See note #7 
     $desired_output = $line; 
    } 
} 
close $fh;       #See note #8 
say "$desired_output"; 

而是采用分体式的,何不干脆删除字段分隔完全与替代命令?另请注意,我将输出保存为一个连续的行。内部的if结构比我想象的要复杂一些,但是它很容易遵循。如果$desired_output中没有数据,我只需将$desired_output设置为等于我的线路。否则,我会检查$line是否以数字开头。如果是这样,我会附加\n$desired_output,然后附加$line。否则,我追加一个空格,然后$line

现在为我的笔记。这或多或少写在现在称为标准Perl风格的内容中。这包括一些很好的建议(使用strict,warnings等)和现代程序的布局方式。例如,使用下划线来分隔变量名称中的单词而不是骆驼套住它们($desired_output$desiredOutput)。 Damian Conway的Perl Best Practices中涵盖了很多这方面的内容。这些可能不是我想要做的事情,但我会这样做,因为这是其他人正在做的事情。而且,遵循标准通常比抱怨更重要。这涉及维护和可读性。你跟随着人群。

  1. 总是把这三行放在你的所有程序中。前两个将捕获90%的编程错误,use features qw(say);允许您使用say而不是print。它可以帮助您避免在最后添加\n,这可能比现在听起来更重要。相信我,如果可能的话,你宁愿使用say而不是print

  2. use autodie当程序不应该继续运行时,可以在Perl中处理很多情况。例如,如果你不能读入你的文件,你可能不会继续你的程序。 autodie的好处在于,当您忘记测试命令的返回值时,它会使程序停止。

  3. 当某些东西没有改变时,你应该使它成为constant。这将您所有的数据不变为数据在一个地方,它允许你定义神秘数字,如PI = 3.1416。不幸的是,除非你知道Perl deep dark secret,否则常量不能很容易地插入输出。

  4. 当您打开文件时,请使用打开命令的three parameter form,并使用标量文件句柄。与旧的全局句柄相比,您可以更轻松地将标量文件句柄传递给子例程。

  5. 不要使用$_,自动变量除非你必须(如grepmap)。它不会提高可读性或加快执行速度。而且,它有让你陷入麻烦的倾向。它是所有软件包中的全局变量,可能会在您不知情的情况下受到影响。

  6. 我总是在chomp每次我读到可能在最后都会有新行的数据,即使它稍后证明可能很方便。行尾的新行可能会导致各种各样的带有正则表达式的惊愕。这可以在本身内部完成:while (chomp (my $line = <$fh>)),但这不会增加可读性或速度。

  7. 请注意我的缩进和我使用括号的方式。这是现在的首选标准。我花了好几年的时间去学习它在帕斯卡​​和K风格C做的方式,这样做。可能早点学习它是正确的。

  8. 当你完成它们时总是关闭文件句柄。这只是一个很好的形式。

相关问题