删除Perl中分隔符之间的空格和换行符

时间:2013-04-08 01:22:30

标签: 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操作系统。

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

4 个答案:

答案 0 :(得分: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风格的方式编写的。这包括一些好的建议(使用strictwarnings等)以及现在的方案布局。例如,使用下划线来分隔变量名称中的单词而不是驼峰($desired_output$desiredOutput)。 Damian Conway的Perl Best Practices涵盖了很多这方面的内容。这些可能不是我想做的事情,但我这样做是因为这是其他人都在做的事情。并且,遵循标准通常比投诉更重要。这是关于维护和可读性。你跟随人群。

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

  2. 当你的程序不能继续运行时,
  3. use autodie处理Perl中的许多情况。例如,如果您无法读入文件,则可能无法继续执行您的程序。关于autodie的好处是,当你忘记测试命令的返回值时,它会阻止你的程序缩短。

  4. 如果某些内容没有变化,您应该将其设为constant。这会将您的所有不变的数据放在一个位置,并允许您定义诸如PI = 3.1416之类的神秘数字。不幸的是,除非你知道Perl deep dark secret,否则常量不能轻易地插入到输出中。

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

  6. 除非必须($_grep),否则请勿使用自动变量map。它不会提高可读性或加快执行速度。而且,它有让你陷入困境的倾向。它是所有包中的全局变量,在您不知情的情况下可能会受到影响。

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

  8. 请注意我的缩进以及使用括号的方式。这是现在的首选标准。我花了几年的时间来学习Pascal和K&amp; R风格C这样做的方式。可能在早期以正确的方式学习它。

  9. 完成后,始终关闭文件句柄。这是一个很好的形式。

答案 1 :(得分:0)

你需要在拆分之前选择“it”变量。

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

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

while ( my $line= <FH> )
{
   chomp ($line);
   ...

答案 2 :(得分:0)

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

你可以使用chomp擦除文件中的'/ n'。

答案 3 :(得分:0)

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

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