2011-07-02 11 views
2

私はこのコラムを持っている:列間のスペースをいくつか取り除き、内部にカスタム数のスペースを入れるにはどうすればいいですか?

 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 

をし、それらの間のスペース
のカスタム数(すべての列の間のスペースの同じ番号を追加)。

これを行う方法はありますか?
(私の左と右揃えテーブル用)

編集:
誰でもコラム(。\%C)の内容を確認する方法を知っていますか?

+0

いますよur列のフィールドにスペースが含まれていますか?列の端をどのように決定すべきか?特定のデリミタまたは右端の正確な位置 –

答えて

1

'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

あなたの説明からわかる限り、あなたは2つのパスをライン上で行う必要があります。

最初のパスでは、すべてのフィールドの幅を決定する必要があり、リスト全体を通過するまではわかりません。たとえば、あなたがポルトガルとラインに達するまで、アメリカとフランスの間の3つのスペースを取り除かなければならないことはわかりません。

これ以降、2番目のパスは問題ありません。

+0

はい:どのように最初のパスをやりますか? – Reman

関連する問題