2016-11-15 1 views
0

Я пытаюсь читать в наборе | текстовых файлов с разделителями-ограничителями строк и получать количество уникальных значений в определенном столбце для каждого файла, а также количество строк в файле. Я пробовал использовать Import-CSV, но это заняло много времени и использовало много памяти. Файлы могут варьироваться от 20 МБ до 500 МБ, 10-15 файлов.PowerShell - отличительные значения в столбце нескольких файлов

Будет ли использовать считыватель потока быстрее? Как я могу подсчитать уникальные значения?

Get-ChildItem .\*filtered.txt -Name | 
ForEach-Object { 
    if($dayofweek -eq 1) { 
     $importFile = Import-Csv $_ -Delimiter '|' 
    } else { 
     $importFile = Import-Csv $_ -Delimiter '|' -Header @("a", "Order-ID", "c", "d", "e", "f", "g", "h") 
    } 
    $numRows = $importFile | Measure-Object | Select-Object -expand count 
    $numUniqueOrderID = $importFile | Select Order-ID -Unique 
    echo "Filename: $_ `t Rows: $numRows `t" 
    echo "Unique Order-IDs" 
    $numUniqueOrderID 
    echo `n 
} 

ответ

0

Streamreader будет на миллион раз быстрее. Таким образом, идея заключалась бы в том, чтобы получить данные в памяти с помощью Streamreader, а затем сделать $data = ConvertFrom-Csv -InputObject $result. А после этого вы сделаете что-то вроде Sort-Object -unique или добавьте -Property.

Редактировать: Альтернативно, если вы не хотите возиться с Streamreader, вы можете использовать $content = Get-Content $file -ReadCount 0, да, вы потеряете как 0,01% эффективности, но зачем беспокоиться.

0

без уверенности

Get-ChildItem .\*filtered.txt -File | 
% { 
    if($dayofweek -eq 1) 
    {$numUniqueOrderID = (Import-Csv $_.FullName -Delimiter '|' | Select Order-ID -Unique).Count} 
    else 
    {$numUniqueOrderID = (Import-Csv $_.FullName -Delimiter '|' -Header "a", "Order-ID", "c", "d", "e", "f", "g", "h" | Select Order-ID -Unique).Count} 

    $numRows = (gc $_.FullName -ReadCount 0).Count 
    write-host ("Filename: {0}`t Rows : {1}`nUnique Order-IDs : {2}`n" -f $_, $numRows, $numUniqueOrderID) 
    } 
Смежные вопросы