如何在Perl中连接延续行?

时间:2014-04-28 16:57:54

标签: windows perl

我有一个包含以下字符串的CSV文件:

ID1;banana
| apple
| oranges

我希望每次在行的开头都有一个管道时,字符串将被附加到前一行,输出应该是这样的:

ID1;banana | apple | oranges

如何删除以管道|开头的行之前的换行符?

3 个答案:

答案 0 :(得分:4)

在一个hackish one liner中,在管道之前移除返回:

perl -ne '$s = do {local $/; <>}; $s =~ s/\n\|/ |/g; print $s' file.csv

答案 1 :(得分:1)

而不是尝试退格/擦除已经打印的内容,而不是仅在打印回车时打印回车符。不是第一个字符:

perl -n -e 'chomp; /^\s*\|/? print " $_":  print "\n$_" ' yourfile.txt

答案 2 :(得分:0)

您是否显示单个CSV字段的值?如果是这样,那么您应该使用Text::CSV将每一行划分为字段(因为其getline方法是处理包含嵌入换行符的数据的最简单方法)并且您可以使用替换{{1}如果换行符在管道符号之前,则将换行符更改为空格。

这是一个例子

s/\n(?=\|)/ /g

<强>输出

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new({ binary => 1, eol => $/ });

while (my $row = $csv->getline(*DATA)) {
  s/\n(?=\|)/ /g for @$row;
  print "$_: $row->[$_]\n" for 0 .. $#$row;
  print "\n";
}

__DATA__
"ID1;banana
| apple
| oranges",f2,f3
g1,g2,g3

如果您的情况不同,那么您需要解释。