繁体   English   中英

循环浏览大量CSV文件

[英]Loop through huge CSV files

我必须遍历每天约有50.000行的文件,以生成报告并将这些数据记录导入到我们的数据库中

由于我必须执行一些-replace statements和其他内容,因此我目前通过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进行循环可能会更快-不幸的是,我不知道如何开始。

感谢@GuentherSchmitz,我得以创建第三个测试函数。 在下一个测试中,我使用了一个带有〜2.000行的CSV文件,结果如下:

  • Import-CsvVersion1 > 4分钟24秒
  • Import-CsvVersion2 > 0分钟18秒
  • Import-CsvVersion3 > 1分钟20秒

再次感谢您的帮助 :-)

PS:我还摆脱了以前的Write-Progress ,它显然使脚本速度降低了约80%

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM