Импорт-CSV огромного (13M рядов), отфильтрованного с помощью Where-Object с 11k строками - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть огромный CSV-файл с около 13M строк и около 50 столбцов (File # 1). У меня есть другой файл с примерно 11 тысячами строк, это список IP-адресов (Файл № 2), который также является одним из 50 столбцов в первом файле. Как мне выполнить фильтрацию файла № 1, чтобы выходные данные содержали только те строки, в которых найдены IP-адреса из файла № 2?

Вот что я пробовал до сих пор, но он работает в течение 12 часов и считает:

$IP = Get-Content -Path C:\Documents\File2.txt

Import-Csv C:\Documents\File1.csv | Where-Object {$_.IP -eq $IP} | Export-csv -Path C:\Documents\File3.csv -NoTypeInformation

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете заставить этот скрипт работать намного быстрее:

  • Нет необходимости использовать Import-Csv / Export-csv. Чтение / запись строк достаточно и намного быстрее
  • $ _. Ip -in $ IP неэффективен. использование хеш-таблица для поиска (она будет примерно мгновенной)
  • Используйте инструменты .net вместо встроенных командлетов

Ниже приведен скрипт с оптимизацией, о котором я говорил. Проверьте закомментированные строки перед запуском

$inFile = "C:\stack\IpTables\Data.txt"
$IPfile =  "C:\stack\IpTables\IPs.txt"
$outFile = "C:\stack\IpTables\OutData.txt"
$ipIndexInData = 47 #index of IP address column in your data file

#build a hashtable for IP look up. 
$hash = @{}
[System.IO.File]::ReadAllLines($IPfile) | foreach {$hash.Add($_, $true)}
# if IP values in your list are not unique then wrap $hash.Add() with try/catch


$fsIn = [System.IO.StreamReader]$inFile
$fsOut = [System.IO.StreamWriter]$outFile

$fsOut.WriteLine($fsIn.ReadLine()) # this will write first row with column names to out file. Comment it out if first row is data row

while (!$fsIn.EndOfStream) {

 $line = $fsIn.ReadLine()
 $row = $line -split ","

 if($hash[$row[$ipIndexInData].Trim('"')]) { # remove .Trim('"') if values in your data file are not quoted with "

    $fsOut.WriteLine($line)
 }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...