我有幾百個檔案,每個檔案大約 1.5 MB。我需要針對以下回圈運行檔案,但速度很慢。每個檔案回圈播放大約需要 5 分鐘。有更快的方法嗎?
function Convert-File($inputFile,$outputFile,$dataDate)
{
if ([string]::IsNullOrEmpty($dataDate))
{
$dataDate = $inputFile.split('.') | select -last 1
}
Write-Host "File data date is $dataDate"
#Get-Content $inputFile | Select-String -pattern $dataDate | Out-File $outputFile
$header=""
$headerOut=$false
if (Test-Path $outputFile)
{
Remove-Item $outputFile
}
foreach($line in [System.IO.File]::ReadLines($inputFile))
{
if ($line.StartsWith("!"))
{
$header=$line
continue
}
if ($line.Contains($dataDate))
{
if (!$headerOut)
{
$headerOut=$true
#Write-Host $header
Set-Content -Path $outputFile -Value $header.substring(1).Replace('|',',') -Force
}
if ([string]::IsNullOrEmpty($line)) { continue }
#Write-Host $line
Add-Content $outputFile $line.Replace('|',',') -force
}
}
}
該代碼有效,但我希望代碼執行得更快。有什么建議么?
uj5u.com熱心網友回復:
Add-Content是代碼中的瓶頸,FileStream在每次回圈迭代時打開和關閉 a 非常昂貴。這個操作應該只做一次。
此外,值得注意[string]::IsNullOrEmpty( )的應該是回圈的第一個條件,并且很可能您想使用它[string]::IsNullOrWhiteSpace( ),盡管我將由您決定。
這就是你的最終回圈應該如何使用 a 回圈StreamWriter:
try {
foreach($line in [System.IO.File]::ReadLines($inputFile)) {
if ([string]::IsNullOrEmpty($line)) {
continue
}
if ($line.StartsWith('!')) {
$header = $line
continue
}
if ($line.Contains($dataDate)) {
if (-not $headerOut) {
$headerOut = $true
$fs = (New-Item $outputFile -Force).OpenWrite()
$writer = [System.IO.StreamWriter] $fs
$writer.WriteLine($header.SubString(1).Replace('|', ','))
}
$writer.WriteLine($line.Replace('|', ','))
}
}
}
finally {
$writer, $fs | ForEach-Object Dispose
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/521945.html
標籤:电源外壳表现io
