0

我在 perl 中有一个数组,其中包含大约 200 个用于 csv 文件的索引。它喜欢下面的行:

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);
4

4 回答 4

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;

编辑:将冒号更改为逗号

于 2013-01-18T22:22:40.207 回答
4

我认为打算编码的经典Schwartzian Transform看起来像这样@sdir

use strict;
use warnings;

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

print for @sorted;
于 2013-01-19T01:49:52.610 回答
1

正常排序救援

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

-t,表示在comman 处分开

-n 或 -g 数字排序

-k1,2 使用第 1 到 2 列见 -t

人排序

于 2013-01-18T22:14:51.120 回答
-1

我会编写一个排序函数来获取每个项目的第一项,然后对这些项目进行比较。它将是以下形式:

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

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

然后调用子例程作为调用排序的一部分:

@sortedArray = sort sortStuff @array;

它将按数字排序并忽略该行中的其余项目。

于 2013-01-18T22:20:18.983 回答