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

Ale*_*exx 3 perl text-processing

我正在解析一个文件。

文件格式是这样的:


Column1  Column2  Column3  Column4  Column5
1        2        3        4        5
6        7                 8        9
10       11       12                14
         15       16       17       18

Run Code Online (Sandbox Code Playgroud)

一些列是空的。所以我正在读取与上述格式相同的两个文件并合并这两个文件并添加“|” 每列之间,所以它应该是这样的:


Column1 | Column2 | Column3 | Column4 | Column5
1       | 2       | 3       | 4       | 5
6       | 7       |         | 8       | 9
10      | 11      | 12      |         | 14
        | 15      | 16      | 17      | 18

Run Code Online (Sandbox Code Playgroud)

但我越来越像这样。列中的空格被删除。


Column1 | Column2 | Column3 | Column4 | Column5
1       | 2       | 3       | 4       | 5
6       | 7       | 8       | 9
10      | 11      | 12      | 14
15      | 16      | 17      | 18

Run Code Online (Sandbox Code Playgroud)

代码部分:

while(<FH>){
   my @lines =split ' ',$_;
   say (join '|',@lines);
}
Run Code Online (Sandbox Code Playgroud)

我知道这是因为我用空格分隔符分割。谁能告诉我如何获得所需的输出?

too*_*lic 8

您可以使用unpack来解析固定宽度的数据。该A9模板假定你列9个字符宽。您可以使用sprintf将数据再次分隔到原始宽度的列中。

use warnings;
use strict;

while (<DATA>) {
    chomp;
    printf "%s\n", 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
Run Code Online (Sandbox Code Playgroud)

这打印:

Column1 | Column2 | Column3 | Column4 | Column5 
1       | 2       | 3       | 4       | 5       
6       | 7       |         | 8       | 9       
10      | 11      | 12      |         | 14      
        | 15      | 16      | 17      | 18      
Run Code Online (Sandbox Code Playgroud)