在读取固定宽度数据时保留空白列并添加分隔符



我正在解析一个文件。

文件格式如下:


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

更多信息请访问

谢谢。

最新更新