Перебирайте огромные файлы CSV - PullRequest
0 голосов
/ 16 января 2019

Мне нужно циклически проходить по файлу с ~ 50.000 строк каждый день, чтобы генерировать отчеты и импортировать эти записи данных в нашу базу данных.

Поскольку мне нужно выполнить некоторые -replace -выступления и прочее, которые я в настоящее время перебираюкаждая строка через foreach.Этот подход заканчивается через ~ 16 минут:

$csv_file = ".\testfile.csv"
$csv_import = Import-Csv $csv_file -Delimiter ";" -Encoding "default"

function Import-CsvVersion1 {
    $results = @()

    foreach ($data in $csv_import) {
        $properties = [ordered]@{
            id          = $data."id"
            name        = $data."name"
            description = $data."description"
            netcost     = $data."netcost"
            rrp         = $data."rrp"
        }
        $results += New-Object PSObject -Property $properties
    }

    # Export $results into final csv
}

Я нашел другой подход, в котором результат foreach будет назначен непосредственно переменной $results.Этот подход завершился через ~ 8 минут (поэтому ему требуется только половина времени):

$csv_file = ".\testfile.csv"
$csv_import = Import-Csv $csv_file -Delimiter ";" -Encoding "default"

function Import-CsvVersion2 {
    $results = foreach ($data in $csv_import) {
        [PSCustomObject]@{
            id          = $data."id"
            name        = $data."name"
            description = $data."description"
            netcost     = $data."netcost"
            rrp         = $data."rrp"
        }
    }

    # Export $results into final csv
}

Я где-то читал, что цикл через ForEach-Object может быть еще быстрее - к сожалению, я не знаюкак начать с этого.

1 Ответ

0 голосов
/ 16 января 2019

Благодаря @GuentherSchmitz мне удалось создать третью тест-функцию. В следующем тесте я использовал CSV-файл с ~ 2000 строк, результаты где:

  • Import-CsvVersion1 -> 4 минуты 24 секунды
  • Import-CsvVersion2 -> 0 минут 18 секунд
  • Import-CsvVersion3 -> 1 минута 20 секунд

Еще раз спасибо за помощь: -)

P.S .: Я также избавился от прежнего Write-Progress, который, по-видимому, замедлил сценарий примерно на 80%

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