我正在解析一个文件。
文件格式如下:
Column1 Column2 Column3 Column4 Column5
1 2 3 4 5
6 7 8 9
10 11 12 14
15 16 17 18
有些列是空的。所以我正在阅读两个与上述格式相同的文件,并合并这两个文件并添加"|"在每一列之间,看起来应该是这样的:
Column1 | Column2 | Column3 | Column4 | Column5
1 | 2 | 3 | 4 | 5
6 | 7 | | 8 | 9
10 | 11 | 12 | | 14
| 15 | 16 | 17 | 18
但是我变得这样了。删除列中的空格。
Column1 | Column2 | Column3 | Column4 | Column5
1 | 2 | 3 | 4 | 5
6 | 7 | 8 | 9
10 | 11 | 12 | 14
15 | 16 | 17 | 18
代码部分:
while(<FH>){
my @lines =split ' ',$_;
say (join '|',@lines);
}
我知道这正在发生,因为我用空格分隔符分隔。谁能告诉我如何得到想要的输出?
您可以使用unpack来解析固定宽度的数据。模板中的A9
假定列的宽度为9个字符。您可以使用sprintf将数据再次分隔成原始宽度的列。
use warnings;
use strict;
while (<DATA>) {
chomp;
printf "%sn", join '| ', map { sprintf '%-8s', $_ } unpack 'A9' x 5, $_;
}
__DATA__
Column1 Column2 Column3 Column4 Column5
1 2 3 4 5
6 7 8 9
10 11 12 14
15 16 17 18
这个打印:
Column1 | Column2 | Column3 | Column4 | Column5
1 | 2 | 3 | 4 | 5
6 | 7 | | 8 | 9
10 | 11 | 12 | | 14
| 15 | 16 | 17 | 18
如果您不需要解析数据来做任何事情,只需重新格式化它,您可以使用regex替换来添加竖条字符。
此代码将在每9个字符之后添加|
。这假定您的数据是固定宽度的列。K
断言意味着保持(得到它?)所有向左匹配的文本,而不是用替代文本替换它。因此,实际上它允许您设置将放置s///
右侧文本的点。/m
选项告诉Perl这是一个多行字符串。(?!$)
断言表示"不在行尾"。这样我们就不会在最后一列后面插入任何东西。
我把所有的文本放在一个变量中,但你也可以逐行执行。
如果列是可变宽度,你仍然可以用正则表达式来做,但它会变得更复杂。在这种情况下,unpack/sprintf
可能更简单。
$s = '
Column1 Column2 Column3 Column4 Column5
1 2 3 4 5
6 7 8 9
10 11 12 14
15 16 17 18
';
$s =~ s/.{9}(?!$)K/| /gm;
print $s;
Column1 | Column2 | Column3 | Column4 | Column5
1 | 2 | 3 | 4 | 5
6 | 7 | | 8 | 9
10 | 11 | 12 | | 14
| 15 | 16 | 17 | 18
更多信息请访问
谢谢。