используйте PowerShell для просмотра большого количества больших файлов - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть около 70 файлов CSV, все размером около 1 ГБ. В среде Windows мне нужно пройти через них все, чтобы найти конкретные строки.

Мой поисковый файл с именем input.txt содержит следующие строки:

  • CG234242424
  • CG234234234
  • CG234234235

В среде Linux я бы сделал следующее:

for line in `cat input.txt`; do grep $line *.csv >> output.txt; done;

Как бы я сделал это в Powershell?

Предыстория - я парень из Linux. Это разовая просьба бизнес-пользователей о проведении аудита.

1 Ответ

2 голосов
/ 06 ноября 2019

Я бы построил регулярное выражение из строк во входном файле, а затем использовал Select-String, чтобы проверить файлы CSV на наличие этого шаблона:

$re = (Get-Content 'input.txt' | ForEach-Object { [regex]::Escape($_) }) -join '|'
Select-String -Path '*.csv' -Pattern $re -CaseSensitive > 'output.txt' 

Но поскольку PowerShell производит структурированныеданные, а не простой вывод строки, вы можете использовать эту структуру:

$re = (Get-Content 'input.txt' | ForEach-Object { [regex]::Escape($_) }) -join '|'
Select-String -Path '*.csv' -Pattern $re -CaseSensitive |
    Select-Object Filename, LineNumber, Line |
    Export-Csv 'output.csv' -NoType

Если вам нужно обрабатывать каждую строку из входного файла отдельно, вы бы сделали это следующим образом:

foreach ($line in Get-Content 'input.txt') {
    Select-String -Path '*.csv' -Pattern $line -SimpleMatch -CaseSensitive |
        Select-Object Filename, LineNumber, Line |
        Export-Csv 'output.csv' -NoType -Append
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...