如何从巨大的文本中随机抽样少量行
现有文本huge.txt,前 5 行内容如下:
f1 |
f2 |
yewhhgfifsbplrxankqazzewzkhfxjetiprfvyinchmdventatkry |
lwxazkmczmpcluechdtfgwapgvyzfxqczcuvadkfqrcciptmpo |
viqxbdjjzkdcytdnjiuexottvgdjkafhykbotjsupyuybvgycqhfsdlypuftbezga |
mmoermrlbovwmfnxgctizucfccatwlvugnqvikhbgaqvamwbzqluwavgcjtonutairrafrpywtwtpocgltmfrxz |
plhdyslghehlptlsczizhjbtcqwasvspjqyeifsnqagqovvdukxftsp |
tlisnnguudbqgrupqpoqjfshldpuwjdkfeizhkfwsvmdspswusmclhqzzxaumvwrerbsl |
bltnilcncwgnsyxeosdtytvpdbxuiwukdqpgvvbihoqvvmhogmffzpivuysbhgitfqxptyuofsukmz |
ajojwbcfptahjetpnmkbsfrblubvvjxyestplybzpxxwsrppgteoreckkscrsu |
… |
… |
该文本有200GB,现需要从中随机抽样 1 万行数据
借助集算器可以很方便地完成这件事。可去润乾网站下载集算器职场版,运行时需要一个授权,免费版本就够用。
1. 在集算器中编写脚本sample.dfx:
A |
|
1 |
=file("huge.txt") |
2 |
=A1.cursor@t() |
3 |
=A2.fetch(100).(len(f1)+len(f2)).avg() |
4 |
=A1.size()/A3 |
5 |
=10000.(rand(A4)) |
6 |
=A5.(A1.cursor@t(;~:A4).fetch(1)).conj() |
A1 打开文件 huge.txt
A2 对文件建立游标
A3 取前 100 条记录,计算记录的平均长度(字节数)
A4 估算文件行数,文件总字节数 / 记录平均字节数
A5 生成 1 万个随机行数
A6 将文本文件拆成 n 段,n 为估算出的行数,随机选 1 万段,取每段的第一行
2. 执行脚本,A6 是需要计算出的结果 。
本题解答的特点在于:做法较简单,抽样结果较粗略。因为总段数是估算的,估算值若大于实际行数,最终样本结果可能略小于1 万。