2016-12-05 5 views
0

Здравствуйте, я только что начал powershell, и я работаю с скриптом powershell, который должен проходить через большие строки, содержащие строки, такие как «ABCD #######»; »#### ";" @@ "; ##;" @@ "; ####; #####;" @ ";. То, что мне нужно сделать в 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 
} 

}

код работает (если редактирование не пропустите ничего) его только что KornShell версия этого завершает flttemp $ fileNo файлы в 1 минуту, пока он занимает 4-5 минут PowerShell , что слишком медленно для того, сколько файлов должен пройти этот скрипт. Мой вопрос еще раз: есть ли способ, которым я не использую, чтобы оптимизировать 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

Я довольно новичок в этом, поэтому я не знаю, как бы я зацикливал $ lines в powershell. – Adlis

+0

Проверьте обновленный код – Asnivor

+0

Спасибо, это улучшение на 30 секунд, но все же слишком медленное для того, что мне нужно. Powershell, я думаю, слишком медленный для итерации через большие файлы. Я рассмотрю ReadAllText и посмотрю, смогу ли я с этим что-то сделать. – Adlis