我有一个大的管道分隔输入文件大约600万行,如下所示:
24|BBG000SJFVB0|EQ0000000009296012|OI SA-ADR|OIBR/C|US|ADR|Equity 16|BBG002PHVB83|EQ0000000022353186|BLOOM SELECT INCOME FUND|BLB-U|CT|Closed-End Fund|Equity
-50|BBG000V0TN75|EQ0000000010271114|MECHEL-PREF SPON ADR|MTL/P|US|ADR|Equity 20|BBG002S0ZR60|EQ0000000022739316|DIVIDEND 15 SPLIT CORP II-RT|DF-R|CT|Closed-End Fund|Equity
-20|BBG001R3LGM8|EQ0000000017879513|ING FLOATING RATE SENIOR LOA|ISL/U|CT|Closed-End Fund|Equity 0|BBG006M6SXL2|EQ0000000006846232|AA PLC|AA/|LN|Common Stock|Equity
要求如下:
1.我需要按照该顺序对第一列,第二列,第二列进行排序 2.在终端/控制台中显示排序完成百分比,例如"第2列75%完成排序"
3.最后输出一个单独的文件。
我已经编写了下面的程序,它完全按第一列排序。 但如何融入所有其他条件?现在它还需要更多的时间来运行。有没有更有效和更清洁的方法呢?唯一的问题是我们无法使用CPAN的任何其他外部包。像使用SED / AWK这样的Unix解决方案是可以的,但Perl更可取。我刚才知道内置的Python也在那里,所以也欢迎解决方案。
my (%link_strength);
{$data="datascope_input.txt";
$out="sort_file.txt";
open (my $indata , '<', $data)|| die "could not open $data :\n$!";
open (my $outdata , '>', $out)|| die "could not open $out :\n$!";
select $outdata;
my @array=(<$indata>);
for (@array){
$link_strength{$1}=$_ if /(?:[^|]+\|){0}([^|]+)/;
}
print $link_strength{$_} for (sort {$a<=>$b} keys %link_strength);
close ($outdata);
close ($indata);
}
答案 0 :(得分:2)
正如我在评论中所说,Linux / Unix系统排序可能会表现得更好,但如果你真的想要Perl,那就可以解决这个问题:
Control nextControl;
if (e.KeyCode == Keys.Enter)
{
nextControl = GetNextControl(ActiveControl, !e.Shift);
if (nextControl == null)
{
nextControl = GetNextControl(null, true);
}
nextControl.Focus();
TextBox box = nextControl as TextBox;
if (box != null)
box.Select(box.Text.Length, 0);
e.SuppressKeyPress = true;
}
正如我在评论中所说,我知道无法自省收集进度信息。你可以通过计算发生了多少次比较来破解某些东西,但由于你永远无法确定最终的数字,因此无法计算完成百分比。
答案 1 :(得分:0)
从您的示例数据中,您将排序大约950MB。从普通高清(100MB / s)读取需要9.5秒。我不知道标准sort
的排序速度有多快,但根据我的经验,它可以为每个CPU核心提供1-3百万条记录。比方说100万。在双核上需要3秒,在具有更多CPU核心的服务器上需要更少。我认为大部分时间都会读取和解析您的数据。这么简单
pv -p your_file.dat | sort -t'|' -k '1n,1' -k '2d,2' -k '14,14'
应该完成大部分必需的功能。