【问题标题】:Parse multiple lines of text with powershell and export to csv使用 powershell 解析多行文本并导出为 csv
【发布时间】:2018-02-16 15:41:10
【问题描述】:

我有多个要导出为 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 }

【问题讨论】:

  • 能否请您发布部分登录文本,以便我尝试一下
  • 2017-09-04 12:31:11.343 General BOECD:: ProcessStartTime: Word: Length 3 [0917 1204 3029] Hex: Length 6 [17 09 04 12 29 30]。显示:错误 2017-09-04 12:31:11.479 一般 MelsecIoWrapper:扫描结束:设备:1,ScanStart:9/4/2017 12:31:10 PM 显示:错误 2017-09-04 12:31:11.705 一般BOECD:: ProcessEndTime:字:长度 3 [0917 1204 0931] 十六进制:长度 6 [17 09 04 12 31 09]。显示:False 2017-09-04 12:31:13.082 General BOECD::DV 数据:
  • 注意:在实际的日志文件中,日期总是像上图一样开始一行。当我粘贴示例时,它只是将所有内容都包装在一起。
  • 你应该edit你的问题并将示例文本放在那里而不是回复它。如果不是因为您刚刚遇到的格式问题。

标签: string powershell csv parsing


【解决方案1】:

将原始文件作为多行字符串读取,然后使用 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 一般 BOECD:: ProcessStartTime: ... 2017-09-04 12:31:11.479 通用 MelsecIoWrapper:扫描结束:设备:1,ScanStart:2017 年 9 月 4 日下午 12:31:10 显示:假 2017-09-04 12:31:11.705 一般 BOECD:: ProcessEndTime: ... 2017-09-04 12:31:13.082 一般 BOECD:: DV 数据:

两行末尾的... 是为了在屏幕上显示多行值而截断多行值的位置,但该值完好无损。

(?=...) 是所谓的“正向前瞻断言”。这样的断言会导致正则表达式匹配给定的模式,而不会将其实际包含在返回的匹配/字符串中。在这种情况下,匹配会在时间戳之前返回空字符串,因此可以在此处拆分字符串而无需删除时间戳。

【讨论】:

  • 我会让模式 (?m)(?=^\d{4}-...) 专门匹配行首的时间戳。连字符和冒号不需要转义,顺便说一句。
  • 谢谢,我很难记住在 RegEx 中什么都是保留字符,所以有时我倾向于过度转义。我还更新了答案,以反映您仅在行首获取日期/时间的建议,这是一个好主意。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2020-03-14
  • 2020-11-07
  • 1970-01-01
  • 2019-06-09
相关资源
最近更新 更多