2010-06-15 144 views
1

我正在創建一個perl腳本來打印汽車模型和顏色,並且數據如下。我想知道是否有任何方法可以讓汽車模型駛向某個領域,以便隨時隨地打印它?以下數據是一個csv文件。我想要的數據看報表上的方式是下面還有Perl腳本打印出汽車模型和汽車顏色

********這是數據的外觀********

Chevy 
blue,1978,Washington 
brown,1989,Dallas 
black,2001,Queens 
white,2003,Manhattan 

Toyota 
red,2003,Bronx 
green,2004,Queens 
brown,2002,Brooklyn 
black,1999,Harlem 

** *********這是我想獲得的數據在報告看***********

汽車模型:豐田

顏色:紅色年份:2002城市:皇后區

+4

到目前爲止你有什麼代碼? – Ether 2010-06-15 21:22:07

+2

像「豐田」和「雪佛蘭」這樣的名稱是汽車*製造*,而不是車型。模型就像「凱美瑞」或「塔霍」。 – 2010-06-15 21:47:35

+1

那麼你想爲每條數據行重複make行嗎?或者你想爲每組數據行創建一次make行嗎?第一種選擇似乎是你從當前的迴應中得到的,但我懷疑你真正想要的是第二種選擇。不幸的是,你的輸出示例只顯示一行數據,因此很難說出預期的結果。 – 2010-06-16 03:12:06

回答

1
open IN, "< somefile"; 
while (<IN>) { 
    chomp; 
    if (m/,/) { 
    @temp = split /,/, $_; 
    printf "Car model: %s\nColor: %s\nYear: %s\nCity: %s\n\n", $make, @temp; 
    } else { 
    $make = $_; 
    } 
} 
+2

這不會在嚴格使用下運行,所有代碼都應該使用。此外,建議使用3-arg打開。 – 2010-06-16 09:15:49

0

我會去通過文件一行一行地對各行(僞代碼,未測試):

if ($line ~= /\w+,\d+,\w+/) { # matches the lines with the information 
    my $array = split $line at , 
    print to file array[0] + "," + array[1] + "," + array[2] + "\n" 
} elsif ($line ~= /\w+/) { # matches the car model since the information was already matched 
    print "Car Model:" + $line + "\n" 
} else { # must be the whitespace so you know the information about the car is done 
    print "\n" # to separate the car information 
} 

如果你沒有在你的CSV文件中的空行,然後就換​​行來分隔其他車型

4
open my $fh, '<', 'filename' or die $!; 

while (<$fh>) { 
    next if /^\s*$/; 
    my @fields = split /,/, $_; 
    print("Car Model: $fields[0]\n"), next if @fields == 1; 

    my %data; 
    @data{qw(color year city)} = @fields; 
    print "Color:$data{color} Year:$data{year} City:$data{city}\n"; 
} 
+0

哇,使用數組作爲哈希鍵...? – Brian 2010-06-15 21:31:11

+0

@Brian:這被稱爲散列片。 http://www.perlcircus.org/hashes.shtml – 2010-06-15 21:33:21

+0

我想在make上打印(對不起,你是對的),然後列出所有車輛下的所有車輛,而不是每輛車重複。 例如 雪佛蘭 車資訊信息 車資訊信息 車資訊信息 車資訊信息 福特 車資訊信息 車資訊信息 車資訊信息 車資訊信息 豐田 車資訊信息 車信息info 汽車信息信息 汽車信息信息 感謝您的幫助 – 2010-06-16 14:24:32