powershell遍历大文件

时间:2016-12-05 17:09:11

标签: powershell large-files powershell-v4.0 iterate

您好我刚刚开始使用PowerShell,我正在使用一个PowerShell脚本来迭代一个大文件,其中包含" ABCD #######";" ##;# ###&#34 ;;" @@&#34 ;; ##;" @@&#34 ;; ####; #####;"&@ #34 ;;。我在powershell中需要做的是遍历这个文件,该文件可以包含超过20,000行,并从每行中获取部分信息并将其输出到另一个文件。我有这个工作,问题是它真的很慢,并想知道是否有人可以帮助我的代码。

foreach ($fileName in (ls i.gft1* | %{$_.name})){   
$fileNo=1
$STUFFCount=0
cd work
new-item flttemp$fileNo -type file -force
cat $fileName | %{$_.replace('"','')} > temp 

foreach ($line in (cat temp)){
    echo $containerCount

    if ($STUFFCount -eq 999)
    {
        $fileNo=$fileNo+1
        $STUFFCount=0
        break;
        new-item flttemp$fileNo -type file
    }
    add-content flttemp$fileNo "STUFF_START" -encoding utf8
    add-content flttemp$fileNo "STUFF"-encoding utf8
    $no=$line.split(";")[0]
    if ($line.substring("3","1") -eq "U")
    {
        add-content flttemp$fileNo "STUFF_TYPE:STUFF" -encoding utf8
    }
    else
    {
        add-content flttemp$fileNo "STUFF_TYPE:STUFF" -encoding utf8
    }
    add-content flttemp$fileNo "STUFF_NO:$no" -encoding utf8
    add-content flttemp$fileNo "STUFF_NOTO:$no" -encoding utf8
    $ISO=$line.split(";")[1]
    add-content flttemp$fileNo "STUFF_ISO:$ISO" -encoding utf8
    $weight=$line.split(";")[5]
    if ($weight -gt 0)
    {
        $weight=2.20462 * $weight
        $weight=$weight.tostring("#.##")
        add-content flttemp$fileNo "STUFF_WGT:$weight" -encoding utf8
    }
    else
    {
        add-content flttemp$fileNo "STUFF_WGT:" -encoding utf8
    }
    $weight=$line.split(";")[6]
    if ($weight -gt 0)
    {
        $weight=2.20462 * $weight
        $weight=$weight.tostring("#.##")
        add-content flttemp$fileNo "STUFF_MWGT:$weight" -encoding utf8
    }
    else
    {
        add-content flttemp$fileNo "STUFF_MWGT:" -encoding utf8
    }
    add-content flttemp$fileNo "}STUFF_END" -encoding utf8
    $STUFFCount=$STUFFCount+1
}

}

代码有效(如果编辑没有错过任何内容),只需要kornshell版本在1分钟内完成flttemp $ fileNo文件,而它需要4到5分钟的PowerShell,这对于如何这个脚本需要经历的许多文件。我的问题是,有没有一种方法我没有使用优化PowerShell来更快地读取文件。

1 个答案:

答案 0 :(得分:0)

您可以尝试将每个文件完全读入内存,然后再进行操作。在处理大文件时,这肯定会加快速度。

foreach ($fileName in (ls i.gft1* | %{$_.name}))
{
    $fileString = [IO.File]::ReadAllText("$filename")  # gives you one string containing whole file

    # or

    $lines = [IO.File]::ReadAllLines("$filename")   # gives a collection of strings (lines)   

    foreach ($line in $lines)
    {
        # $line is a line (string)
    } 
}