2011-02-16 76 views
0

我正在爲文件中的字段應用某些轉換規則的文件構建轉換邏輯。這種變換規則的例子是:某些字段Perl轉換邏輯 - 文件處理或數據庫

  • 設置缺省值,如果它們是空的(如果第5欄是空的,將其設置爲「空」)
  • 基於某些列總結文件(如果文件有COL1,COL2和COL3,總結文件聚集COL3所有COL1)
  • 在某些領域替換字符串(以 「AY」 全部替換 「開刀」,在COL1)
  • 等等

從性能角度,當d在大文件上執行這些轉換,最好使用純文件處理(逐行讀取文件,使用散列進行彙總,對其他轉換使用正則表達式等),或者將數據加載到數據庫表中,然後彙總並應用所有轉換邏輯並將其下載迴文件?

例如聚合的:

原始文件具有:

A | B | C | 100 | 200 | 300

A | B | C | 200 | 100 | 0

A | X | C | 100 | 100 | 100

轉化文件具有:

A | B | 300 | 300 | 300

A | X | 100 | 100 | 100

+0

您能澄清一下col3的內容是什麼嗎? col3在每一行都是一樣的嗎?如果你改變了一行,它會改變另一行的col3嗎? – Tim 2011-02-16 23:07:00

+0

是的,所以規則將適用於每一行中的所有col3值。 – Chris 2011-02-16 23:35:36

回答

0

最好的解決辦法是編寫系統兩種方式,並進行測量,以決定哪個更好。

1

假設你已經給出的數據,這個問題是非常Perl的掌握之中沒有一個數據庫:

my %data; 
while (my $line = <DATA>) { 
    chomp $line; 
    my ($c1, $c2, undef, @cols) = split /\|/, $line, -1; 

    $data{"$c1|$c2"}[$_] += $cols[$_] for 0 .. $#cols; 
} 

print join('|' => $_, @{ $data{$_} }), "\n" for sort keys %data; 

__DATA__ 
A|B|C|100|200|300 
A|B|C|200|100|0 
A|X|C|100|100|100 

它打印:

 
A|B|300|300|300 
A|X|100|100|100 

你當然需要在剩下的轉換的代碼,但這應該給你一個開始。即使事實證明你需要不止一次訪問原始行,假設你的數據不是很大,你可以將它加載到一個二維數組中,然後在它上面運行你的通行證。或者,您可以使用Tie::File訪問非常大的文件,但不會全部讀取它。