簡體   English   中英

使用Powershell解析多行文本並導出到csv

[英]Parse multiple lines of text with powershell and export to csv

我有多個要導出為CSV的大型日志文件。 首先,我只想拆分兩個部分,即日期和事件。 我遇到的問題是,並非每行都以日期開頭。

這是日志示例塊。 日期/時間始終為23個字符。 其余的隨日志和事件描述而變化。

在此處輸入圖片說明

我希望最終結果在excel中看起來像這樣。

在此處輸入圖片說明

到目前為止,這是我嘗試過的操作,但是只返回每行的前23個字符。

$content = Get-Content myfile.log -TotalCount 50 
for($i = 0; $i -lt $content.Length; $i++) {
$a = $content[$i].ToCharArray()
$b = ([string]$a[0..23]).replace(" ","")
Write-Host $b }

以多行字符串的形式讀取原始文件,然后使用RegEx分割日期模式,並為每個塊創建一個具有兩個所需屬性的自定義對象,其中第一個值是前23個字符,第二個值是修剪后的字符串的其余部分。

(Get-Content C:\Path\To\File.csv -Raw) -split '(?m)(?=^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})'|
    Where{$_}|
    ForEach-Object{
        [PSCustomObject]@{
            'Col1'=$_.Substring(0,23)
            'Col2'=$_.Substring(23).Trim()
        }
    }

然后,您可以將其通過管道傳輸到CSV,或者對數據進行任何處理。 如果文件確實很大,這可能不可行,但我認為對幾百兆的文件應該可以。 使用輸出的示例文本:

Col1                    Col2
----                    ----
2017-09-04 12:31:11.343 General BOECD:: ProcessStartTime: ...
2017-09-04 12:31:11.479 General MelsecIoWrapper: Scan ended: device: 1, ScanStart: 9/4/2017 12:31:10 PM Display: False
2017-09-04 12:31:11.705 General BOECD:: ProcessEndTime: ...
2017-09-04 12:31:13.082 General BOECD:: DV Data:

兩行末尾的...是截斷多行值以便在屏幕上顯示的地方,但是該值完整無缺。

(?=...)是所謂的“正向超前斷言”。 這種斷言會導致正則表達式匹配給定的模式,而實際上並未將其包含在返回的match / string中。 在這種情況下,匹配會在時間戳記之前返回空字符串,因此可以在不刪除時間戳記的情況下在其中拆分字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM