2014-01-24 42 views
-3

我有關於類別支出的客戶信息。 它與管道分隔符一樣在平面文件中。用於從.txt進行多行文本解析的Perl腳本

Jane|groceries|$30.02 
Victor|entertainment|$40.57 
Cedric|fuel|$10.84 
Jane|fuel|$20.93 
Cedric|entertainment|$75.06 

我需要生成的輸出文件,說明每個客戶

+0

做了這個帖子顯示格式你打算的方式還是這些也是行劃分的?我問的原因是因爲除非每個記錄之間的字符是唯一的(除非你假設每個記錄中的第一個字段沒有數字),否則將不可能解析該字符。 – krowe

+3

顯示你的Perl代碼。 – toolic

+0

是的。新客戶在金額欄 – user3230201

回答

2
my %sum_for; 
while (<>) { 
    chomp; 
    my ($name, $item, $price) = split /[|]/; 
    $price =~ s/^\$//; 
    $sum_for{$name} += $price; 
} 

say "$_: \$$sum_for{$_}" for sort keys %sum_for; 
+0

之後新線上嘿,非常感謝。它的工作 – user3230201

+0

我想獲得一份報告,列出他們在每個類別中使用代碼的花費,while(){ chomp;它不工作 my($ name,$ item,$ price)= split/[|] /; $ price =〜s/^ \ $ //; foreach $ name($ item){ $ sum_for {$ item} + = $ price } – user3230201

+0

將其歸入類別只需執行'$ sum_for {$ name} {$ item} + = $ price;'this會產生哈希散列,您可以先按名稱和類別排序,例如Cedric,然後是燃料或娛樂 – Ahdee

0

這樣的事情可以用Perl中一個襯墊來完成花費金額。

perl -F'\|' -lane '$F[2]=~s/\$//;$d->{$F[0]}+=$F[2];END{print"$_=>\$$d->{$_}" for keys %$d;}' your_file.txt 

該首先除去從$價格標籤,然後創建哈希REF Name => Amount連續添加新Amount到現有Amount值相同Name出現時。 END告訴perl只運行一次(遍歷所有行後),因爲它執行的代碼是-n選項。

輸出:使用

Victor=>$40.57 
Jane=>$50.95 
Cedric=>$85.9 

選項:

  • -e =可以被用來輸入程序的一個管線(一個襯墊模式)
  • -a =上自動分割模式反過來,把值從@F陣列上拆分
  • -F'\|' =將分隔符設置爲|
  • -n =會讓perl假設在你的程序while(<>){...}循環
  • -l =啓用自動行結束處理

上使用的選項和可能性更多信息:Perlrun Doc