2013-01-18 160 views
0

我在perl中有一個數組,其中包含大約200個用於csv文件的索引。它喜歡以下幾行:在perl中對數組進行排序

46.9234784633993,Springwood Drive,Naples,FL 
89.7786182217159,W 8th St,Lakeland,FL 

我想在第一個逗號之前按那個數字排序它們。我嘗試過使用這種方法,但有時候這些數字會達到數百和數千,而它只是將1中的所有數字排序。然後數值排序犯規喜歡它,因爲他們不是數字條目

我想這

my @sortedDistances = sort{ $a <=> $b }(@completedDistances); 
and 
my @sortedDistances = sort(@completedDistances); 
+0

然後數字排序不喜歡它,因爲它們不是數字條目? –

+0

**向我們展示您的嘗試。**我們無法從您的描述中判斷您做錯了什麼。編輯您的問題以包含失敗的代碼。然後,描述什麼是不工作的。當你嘗試時發生了什麼?你得到不正確的結果了嗎?你有沒有得到結果?如果結果不正確,是什麼使它們不正確?你想要什麼呢?你有沒有得到任何正確的結果?如果是這樣,他們是什麼?不要讓我們猜測。 –

回答

5

這是一個可能的解決方案,嘗試,如果它的工作原理:

open FILE, "<", $ARGV[0] or die $!; 
my @sorted = 
    map { join ",", @{$_} } 
    sort { $a->[0] <=> $b->[0] } 
    map { [ split /,/ ] } <FILE>; 
close FILE; 
say join "\n", @sorted; 

編輯:改變結腸逗號

+3

這實際上是正確的答案。值得注意的是,使用'split /,/,$ _,2'(帶有第三個參數)更有效,因爲它限制了執行的正則表達式匹配次數。 (另外,跺腳,然後加入一個換行是很搞笑的;'打印@排序'應該也可以) – amon

+0

哈哈,是的;)。更改。 –

1

正常排序救援

sort -t, -n -k1,1 file.cvs 

-t,是指在comman

獨立-n或-g數字排序

-k1,2使用第1列至第2列參閱-t

man sort

+0

這就是我需要的 – shinjuo

+1

這不是perl語法?! –

+0

@sdir:不,但是純粹的人提到他'自我',正確使用它可以節省你很多時間寫有趣的perl用戶,並且調試它們。 – pulven

-1

我會寫一個排序函數來獲得從每個第一項,然後做的項目比較。這將是下面的形式:

sub sortStuff($$) 
{ 
    my ($a) = split(',',$_[0]); 
    my ($b) = split(',',$_[1]); 

    return ($a <=> $b) ; 
} 

,然後調用子程序作爲調用的一部分進行排序:

@sortedArray = sort sortStuff @array; 

它將排序的數量而忽視了其餘項目上線。

4

經典Schwartzian Transform,我認爲@sdir旨在碼,應該是這樣的

use strict; 
use warnings; 

my @sorted = map $_->[0], 
       sort { $a->[1] <=> $b->[1] } 
       map [$_, /([^,]+)/], <>; 

print for @sorted; 
+0

如果最後未排序的csv行不是以'\ n'結尾,並且該行不是排序後的最後一行,則會打印兩行,例如「46.9234784633993,Springwood Drive,Naples,FL89.7786182217159,W 8th St ,萊克蘭,FL」。也許'map {chomp; [$ _,/([^,] +)/]} <>;'然後'print join'\ n「,@sorted;'會有所幫助。 – Kenosis