我正在使用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_Mozart,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在这里不会真正起作用,因为我在一行上有多条信息。如果有人能够指出我正朝着一个好的方向前进(或者这是否可以像我上面的例子那样完成),我将非常感激。
答案 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