在Powershell中是否有一个快速实现,使用15%-85%的分割随机洗牌并拆分包含1500万行的文本文件?
许多消息来源提到如何使用Get-Content来实现,但Get-Content和Get-Random对于大型文件来说速度很慢:
Get-Content "largeFile.txt" | Sort-Object{Get-Random}| Out-file "shuffled.txt"
我一直在寻找使用Stream-Reader和Stream-Writer的解决方案,但我不确定它是否可行。对于我的1500万文件,Linux bash似乎非常快速地执行此操作: How can I shuffle the lines of a text file on the Unix command line or in a shell script?
答案 0 :(得分:1)
不确定这是否会被充分随机化/改组,但它应该更快:
$Idxs = 0..999
Get-Content "largeFile.txt" -ReadCount 1000 |
foreach {
$sample = Get-Random -InputObject $Idxs -Count 150
$_[$sample] |
Add-Content 'shuffled.txt'
}
答案 1 :(得分:0)
我试图使用流式读取器/写入器来消除我的内存使用量,因为其中一些文件超过300MB。我找不到完全避免内存的方法,但是我没有将文件放入内存,而是在0和Total Lines之间创建一个随机数组。该数组指示要放入样本文件的行。
为数据创建流读取器
$reader = New-Object -TypeName System.IO.StreamReader("data.txt");
为测试人群创建流编写器
$writer_stream = New-Object -TypeName System.IO.FileStream(
("test_population.txt"),
[System.IO.FileMode]::Create,
[System.IO.FileAccess]::Write);
$writer= New-Object -TypeName System.IO.StreamWriter(
$writer_stream,
[System.Text.Encoding]::ASCII);
为控制组创建流编写器
$writer_stream_control = New-Object -TypeName System.IO.FileStream(
("control.txt"),
[System.IO.FileMode]::Create,
[System.IO.FileAccess]::Write);
$writer_control= New-Object -TypeName System.IO.StreamWriter(
$writer_stream_control,
[System.Text.Encoding]::ASCII);
确定控件大小并随机选择介于0和文件中总行数之间的数字。
$line_count = 10000000
$control_percent = 0.15
$control_size = [math]::round($control_percent*$line_count)
创建随机数索引以确定哪些行应转到样本文件。确保最后通过排序。
$idx = Get-Random -count $control_size -InputObject(0..($line_count-1))|sort -Unique
表示$ i作为行号;使用$ idx [$ j]作为应该转到示例文件的行
$i = 0; $j = 0
while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine() #Read Line
if ($idx[$j] -eq $i){
$writer_control.WriteLine($OutPut)
$j++
}
else{$writer.WriteLine($OutPut)}
}
$i++
$reader.Close();
$reader.Dispose();
$writer.Flush();
$writer.Close();
$writer.Dispose();
$writer_control.Flush();
$writer_control.Close();
$writer_control.Dispose();