拆分,重新排列,从Powershell中的文本文件中排除字符串以输出到另一个文本文件

时间:2017-02-24 21:41:17

标签: powershell parsing split text-files

我正在使用piconfig从OSIsoft PI System输出陈旧的标签报告,其中包含标签的名称,时间和价值。我无法对piconfig脚本中的内容进行任何编辑,因此我尝试将文本文件(daily-stale-tags-report.txt)解析为新的文本文件,该文件将自动通过电子邮件发送每天早上出去。文本文件目前看起来像这样:

L01_B000_BuildingName0_Citect_more_tag_info_here,22-Feb-17 14:56:23.55301,3.808521E+07
L01_B111_BuildingName1_MainElectric_111A01ME_ALC,23-Apr-15 08:45:00,64075.
L01_B111_BuildingName1_MainSteam_111TC1MS_His_Mozart,20-Jan-17 22:21:34,88778.
L01_B333_BuildingName3_MainWater_333E02MW_Manual,1-Dec-16 18:00:00,4.380384E+07
L01_B333_BuildingName3_SubElectric_333B03SE_Mozart,2-Dec-16 18:45:00,70371.
L01_B333_BuildingName3_Citect_more_tag_333_info_here,4-Jan-17 10:08:33.24501,111730

我需要排除任何以“_Manual”结尾或包含“ _His _ ”的标记,目标是输出更像这样的文本文件:

  

B000 BuildingName0

     

L01_B000_BuildingName0_Citect_more_tag_info_here,22-FEB-17   14:55,8.808521E + 07

     

B111 BuildingName1

     

L01_B111_BuildingName1_MainElectric_111A01ME_ALC,23-APR-15   08:45,64075

     

B333 BuildingName3

     

L01_B333_BuildingName3_SubElectric_333B03SE_M​​ozart,2日 - 12月16   18:45,70371。   L01_B333_BuildingName3_Citect_more_tag_333_info_here,4-JAN-17   10:08,111730

我基本上是一个新手(昨天的生成和成功通过电子邮件发送报告的活动对我来说是一项重大的壮举),所以我试图解决人们之前提出的基本文章和问题。我设法使用这篇文章添加标题:https://www.petri.com/powershell-import-csv-cmdlet-parse-comma-delimited-csv-text-file我认为它看起来像这样:

$input = import-csv "c:daily-stale-tags-report.txt" -header Tag,Date,Value

然后我转到本文https://www.petri.com/powershell-string-parsing-with-substring尝试使用下划线作为分隔符来分割我的数据,目标是提取构建代码(例如B000)和BuildingName。

ForEach ($tag in $input) {$t = ($s -split '_',4)[1..2]}

最后,我试图使用这篇文章powershell Parsing a text file但我被卡住了,因为这个例子不太适用。

从我读过的内容来看,Get-Content在这里不会真正起作用,因为我在一行上有多条信息。如果有人能够指出我正朝着一个好的方向前进(或者这是否可以像我上面的例子那样完成),我将非常感激。

2 个答案:

答案 0 :(得分:2)

此PowerShell脚本接近所需的输出:

$File = "daily-stale-tags-report.txt" 
import-csv $File -header Tag,Date,Value|
  Where {$_.Tag -notmatch '(_His_|_Manual$)'}|
    Select-Object *,@{Name='Building';Expression={"{0} {1}" -f $($_.Tag -split '_')[1..2]}}|
      Format-table -Groupby Building -Property Tag,Date,Value

输出:

   Building: B000 BuildingName0

Tag                                              Date                     Value
---                                              ----                     -----
L01_B000_BuildingName0_Citect_more_tag_info_here 22-Feb-17 14:56:23.55301 3.808521E+07


   Building: B111 BuildingName1

Tag                                              Date               Value
---                                              ----               -----
L01_B111_BuildingName1_MainElectric_111A01ME_ALC 23-Apr-15 08:45:00 64075.


   Building: B333 BuildingName3

Tag                                                  Date                    Value
---                                                  ----                    -----
L01_B333_BuildingName3_SubElectric_333B03SE_Mozart   2-Dec-16 18:45:00       70371.
L01_B333_BuildingName3_Citect_more_tag_333_info_here 4-Jan-17 10:08:33.24501 111730.

答案 1 :(得分:2)

你拥有的是CSV格式的数据,所以很适合Import-CSV,它是使用CSV数据的正确工具... 但是你想要的输出是什么不是CSV数据。它是带有标题和空白行的随机报告,因此使用CSV工具并逐行处理文件并不是很简单,因为您会遇到麻烦将标题之间的内容分组。

  

从我读过的内容来看,Get-Content在这里确实没有用,因为我在一条线上有多条信息。

由于您未将订单内容视为不同的信息,并且日期和电话号码不会包含“手动”字样。或者' 他的',它是可行的。

# Get the lines of the file, drop any that have _his_ or manual, in them
# ('manual,' is a cheeky assumption that the word is at the end of the tag)
Get-Content report.txt | Where-Object { $_ -notmatch '_his_|manual,' } |

    # Split the line by _ and take things 1 and 2 for the building name section header.
    # Group the lines by calculated building name.
    Group-Object -Property { $parts = $_ -split '_'; "$($parts[1]) $($parts[2])" } |

    # process the groups, outputting the building name then all the lines 
    # relating to it, then a blank line
    ForEach-Object { 
        $_.Name
        $_.Group
        ""
    }

e.g.

B000 BuildingName0
L01_B000_BuildingName0_Citect_more_tag_info_here,22-Feb-17 14:56:23.55301,3.808521E+07

B111 BuildingName1
L01_B111_BuildingName1_MainElectric_111A01ME_ALC,23-Apr-15 08:45:00,64075

B333 BuildingName3
L01_B333_BuildingName3_SubElectric_333B03SE_Mozart,2-Dec-16 18:45:00,70371
L01_B333_BuildingName3_Citect_more_tag_333_info_here,4-Jan-17 10:08:33.24501,111730