0
我有大約5GB的logdata需要過濾並找到匹配的行,然後在匹配行中包含+/- 75行。如果數據的格式很重要,那麼就是在缺少一些標籤的XML中。從大型文本文件中導出行的範圍
我的代碼,用火柴找到行:
$ExampleFile = [System.IO.File]::ReadLines("C:\temp\filestomove\ExampleLog.txt")
$AccountNumber = "*123456789*"
$LineCount = 0
$RowsToExport = @()
foreach($line in $ExampleFile){
if($line -like "*$AccountNumber*"){
$RowsToExport += $LineCount
}
$LineCount += 1
}
上面的代碼相當迅速做這項工作,它管理着約MB的日誌每秒。這是一種我可以忍受的速度,因爲這是一次性的工作。
我在努力的是以不是很慢的方式導出匹配的行。
我對於當前的代碼看起來是這樣的:
foreach($row in $RowsToExport){
$IndexRangeHigh = [int]$row + 75
$IndexRangeLow = [int]$row - 75
$test | select -Index ($IndexRangeLow..$IndexRangeHigh) | out-file C:\temp\Example.txt -append
}
這需要很長一段時間,我有我的使用select -index
我懷疑這是非常緩慢的疑慮。以上
措施命令給了我下面的結果上的50MB測試文件:
TotalDays : 0,00354806909375
TotalHours : 0,08515365825
TotalMinutes : 5,109219495
TotalSeconds : 306,5531697
TotalMilliseconds : 306553,1697
在閱讀文件和匹配的行只用了55秒。
總之一切都交給一個問題:
如何從一個大的變量導出行範圍?有沒有其他方法可以用來從$ ExampleFile變量中選擇行而不是使用select -index ($ExampleRangeLow..$ExampleRangeHigh)
?
想通這可能是類似的東西。我會看看我是否可以改編我的代碼來使用StreamReader。不要認爲它應該是一個問題 – Jakodns
不要將大文件讀入內存。當輸入文件變大並且系統開始交換時,它最終會導致系統停止工作。使用'Select-String -Context 75'來提取比賽前後的線。 –