Powershell随机shuffle /拆分大文本文件

时间:2015-05-21 17:59:05

标签: powershell large-data

在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?

2 个答案:

答案 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();