2010-07-15 127 views
2

在perl中有沒有辦法將數據從文件導出到csv文件。 我的意思是,perl - 文本處理 - 輸出到csv文件

說我有一個文件如下..

field1=value1,filed2=value2 
field1=value3,filed2=value4 
field1=value5,filed2=value6 

我想導出此爲Excel格式如下。

field1 field2 
value1 value2 
value3 value4 
value5 value6 

反正這樣做?

此外,這裏有一個小問題。 假設我出口多了一個文件,以相同的CSV文件......其中有一樣內容..

field1=value1,fields2=value8 

我的CSV應該像

field1 field2 
value1 value2 
     value8 
value3 value4 
value5 value6 

是有一個簡單的方法來做到這一點。現在我正在手動做。任何想法,如果有更好的方法。

謝謝。

回答

1

在這裏你去

#!/usr/bin/env perl 

open (IMPORT, "import.txt") || die "Unable to read import file"; 

my @lines = <IMPORT>; 
my @formatted =(); 

for my $line (@lines) { 
    $line =~ s/^.*=(.*?),.*?=(.*?)/$1\t$2/g; 
    push(@formatted, $line); 
} 

my $current_field; 

for my $format_line (sort @formatted) { 
    my($field1, $field2) = (split(/\t/, $format_line)); 
    if ($field1 ne $current_field) { 
     print "$field1"; 
    } 
    print "\t$field2"; 

    $current_field = $field1; 
} 

進口。TXT包含

field1=value1,filed2=value2 
field1=value3,filed2=value4 
field1=value5,filed2=value6 
field1=value1,fields2=value8 

導致

value1 value2 
     value8 
value3 value4 
value5 value6 
+0

謝謝:)非常棒的解決方案:) – jerrygo 2010-07-15 20:42:03

0

在讀入新文件之前,請讀入目標csv文件(如果它不是空的)。創建哈希散列。第一個散列HashA的關鍵字將是field1的值。像value1這樣的鍵的值將是散列HashB。 HashB將具有與value1對應的field2的值。 HashB中的鍵的值將僅爲'1'。 (不管它是什麼)。

現在,當您想要導出第二個文件時,只需將新密鑰添加到HashB的每個密鑰HashA。

這是你的例子。

首先你要做的第一件文件,以獲得

值1 - > {值2 - > 1}
值3 - > {VALUE4 - > 1}
值5 - > {value6 - > 1}

現在,當你符合字段1 =值1,字段2 = value8第二個文件讀取,你只需要添加一鍵HashB爲值1

值1 - > {值2 - > 1,value8 - > 1}
值3 - > {value4 - > 1}
value5 - > {value6 - > 1}

現在,當您遍歷HashA時,將在column1(對於field1)中打印鍵並從HashB打印每個鍵。

#!/usr/bin/perl 

%hashA =(); 

$hashA{"value1"}{"value2"} = 1; 
$hashA{"value3"}{"value4"} = 1; 
$hashA{"value5"}{"value6"} = 1; 

foreach $value1 (sort keys %hashA) { 
    foreach $value2 (sort keys %{ $hashA{$value1} }) { 
     print "$value1, $value2\n"; 
    } 
} 

$hashA{"value1"}{"value8"} = 1; 

print "\n\n"; 
foreach $value1 (sort keys %hashA) { 
    foreach $value2 (sort keys %{ $hashA{$value1} }) { 
     print "$value1, $value2\n"; 
    } 
} 
+1

好,道爾頓解決更多的問題比我做到了。我只是展示瞭如何使用哈希散列。他的解決方案很好。 一個小缺點,如果你的文件很大,並且有很多重複的field1,那麼你需要在@formatted中複製值。散列的散列不會重複該值。不過,這很重要。 – cape1232 2010-07-15 18:53:56

+0

謝謝。那太棒了。但是現在,假設我擁有%hashA中的所有數據,我如何將其轉儲到csv文件。 我試圖通過記錄傾銷它。但是,我的整個記錄​​進入單個單元格,而不是field1,field2等不同的單元格。 – jerrygo 2010-07-15 20:20:22

+0

對不起。我得到了如何去做。我只需在打開文件時提供一個有效的分隔符。 – jerrygo 2010-07-15 20:41:36