2013-01-18 159 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