2017-06-12 54 views
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)

+0

想通這可能是類似的東西。我會看看我是否可以改編我的代碼來使用StreamReader。不要認爲它應該是一個問題 – Jakodns

+1

不要將大文件讀入內存。當輸入文件變大並且系統開始交換時,它最終會導致系統停止工作。使用'Select-String -Context 75'來提取比賽前後的線。 –

回答

3

PowerShell有一個cmdlet(Select-String),允許提取文本和/或匹配後。

Select-String -Path 'C:\path\to\your.log' -Pattern '123456789' -Context 75 

Select-String輸出與幾個屬性的對象,因此,如果您需要在文本格式匹配的行額外的代碼是必需的:

... | ForEach-Object { 
    $pre = $_.Context.PreContext | Out-String 
    $post = $_.Context.PostContext | Out-String 

    "{0}{1}`n{2}" -f $pre, $_.Line, $post 
}