2016-12-05 9 views
0

こんにちは私はpowershellを開始したばかりですが、 "ABCD #######"などの大きなファイルを繰り返し処理するpowershellスクリプトを使って作業しています; "#### ";" @@ "; ##;" @@ "; ####; ####;" @ ";私がPowerShellで行う必要があるのは、このファイルを繰り返し実行することです。このファイルには、20,000行以上の情報が含まれ、各行の情報の一部を取得して別のファイルに出力することができます。私はそれを働かせて、問題は本当に遅く、誰かが私のコードを助けることができるかどうか疑問に思っていた。大きなファイルを繰り返すpowershell

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 
} 

}

コードの作品(編集は何も逃さなかった場合)、それは4-5分PowerShellをとりながら、その本のKornシェルバージョンは1分でflttemp $ FILENOファイルを完了するだけのことこれは、このスクリプトが通過する必要があるファイルの数が少なすぎるためです。私の質問には、PowerShellを最適化してファイルをより速く読み取るために使用していない方法があります。

答えて

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) 
    } 
} 
+0

私はこれでかなり新しいので、私はどのように私は$ラインをpowershellでループするか分からない。 – Adlis

+0

更新されたコードを確認してください – Asnivor

+0

ありがとう、それは30秒の改善ですが、私は必要なもののためにまだ少し遅いです。私が推測するPowershellは、大きなファイルを反復するには遅すぎると思います。私はReadAllTextを調べて、それで何かできるかどうかを見ていきます。 – Adlis

関連する問題