Как убрать количество пробелов между столбцами и разместить произвольное количество пробелов внутри? - PullRequest
2 голосов
/ 02 июля 2011

У меня есть этот столбец:

     USA     France    212     13
  Canada      Spain     34     23
  Me ico      Italy      4    390
   india   Portugal   5900     32
Malaysia    Holland     15     43

Я хочу удалить пробелы вроде этого:

     USA  France 212 13
  Canada   Spain  34 23
  Me ico   Italy   4390
   indiaPortugal5900 32
Malaysia Holland  15 43

и добавить произвольное количество пробелов между ними
(то жеколичество пробелов между каждым столбцом).

Есть ли способ сделать это?
(для моих таблиц по левому и правому краю)

Редактировать:
Кто-нибудь знает, как проверить содержимоестолбец (\%. с)?

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Решение с использованием 'perl'. Я полагаю, первый столбец имеет ширину 8 символов.

Программа:

use strict;
use warnings;

## Hash with contents of each line. Example:
## $file{ 1 } = "... line 1 ..."
## $file{ 2 } = "... line 2 ..."
## ...
my %file;

## Max. number of characters of each column.
## $col_length[0] will have the max. number of characters of all string of
## first column, and the same for the others.
my @col_length;

while ( <> ) {
        next if /^\s*$/;
        chomp;

        ## Save fixed columns in array.
        ## A8 -> 8 characters of first columns.
        ## A11 -> 11 characters of second column.
        ## ...
        my @line = unpack( "A8A11A7A7", $_ );

        ## Remove leading and trailing spaces of each field.
        @line = map { s/^\s*//; s/\s*$//; $_ } @line;

        ## Save max. number of characters of each column.
        for ( 0 .. $#line ) {
                my $l = length $line[$_];
                $col_length[$_] = $l > ($col_length[$_] || 0) ? $l : $col_length[$_]; 
        }

        ## Save each input line.
        push @{ $file{ $. } }, @line;
}

## Print to output.
for ( sort { $a <=> $b } keys %file ) {
        my $format = join "", (map { "%" . $_ . "s" } @col_length), "\n";
        printf $format, @{$file{ $_ }};
}

Входной файл (infile):

     USA     France    212     13
  Canada      Spain     34     23
  Me ico      Italy      4    390
   india   Portugal   5900     32
Malaysia    Holland     15     43

Исполнение:

$ perl script.pl infile

Выход:

     USA  France 212 13
  Canada   Spain  34 23
  Me ico   Italy   4390
   indiaPortugal5900 32
Malaysia Holland  15 43
0 голосов
/ 02 июля 2011

Насколько я могу судить из вашего описания, вам нужно сделать два прохода по строкам.

В первом проходе вам нужно определить ширину всех полей, и вы не сможете определить, пока не пройдете весь список. Например, вы не знаете, что вам придется избавиться от трех пробелов между США и Францией, пока вы не достигнете линии с Португалией.

После второго прохода проблем не должно быть.

...