使用powershell解析多行文本并导出到csv

时间:2017-09-07 19:58:49

标签: string powershell csv parsing

我有多个大型日志文件,我想导出到CSV。首先,我只想分开两个部分,日期和事件。我遇到的问题是并非每条线都以日期开头。

这是一个示例大块的日志。日期/时间始终为23个字符。其余因日志和事件描述而异。

enter image description here

我希望最终结果在excel中看起来像这样。

enter image description here

这是我到目前为止所尝试的内容,但只返回每行的前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 }

1 个答案:

答案 0 :(得分:2)

以raw作为多行字符串读取raw文件,然后使用RegEx拆分日期模式,并为每个chunk创建一个具有所需两个属性的自定义对象,其中第一个值是前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,或者对数据执行任何操作。如果文件真的很大,这可能是不可行的,但它应该可以正常工作在我想的几百megs文件。使用输出的示例文本:

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:

两行末尾的...是截断多行值的地方,以便在屏幕上显示,但值完好无损。

(?=...)是一个所谓的"积极的先行断言"。这样的断言会使正则表达式与给定的模式匹配,而不会在返回的匹配/字符串中实际包含它。在这种情况下,匹配在时间戳之前返回空字符串,因此可以在不删除时间戳的情况下将字符串拆分。