Arrays 使用powershell对文本文件中的日志数据进行排序
我有一个这样的日志文件Arrays 使用powershell对文本文件中的日志数据进行排序,arrays,powershell,sorting,object,data-manipulation,Arrays,Powershell,Sorting,Object,Data Manipulation,我有一个这样的日志文件 2019-11-12 14:25:11538调试计算值:0.04 我希望在最后提取值,如果超过一定数量,则发出警报(警报代码已完成) 到目前为止,我已经写了这篇文章 $array=@(获取内容C:\CR1\AllTransFilter.log) foreach($数组中的行){ $TransDate=$array.Substring(0,10) $TransTime=$array.Substring(11,5) $CalcValue=$array.Substring(4
2019-11-12 14:25:11538调试计算值:0.04
我希望在最后提取值,如果超过一定数量,则发出警报(警报代码已完成)
到目前为止,我已经写了这篇文章
$array=@(获取内容C:\CR1\AllTransFilter.log)
foreach($数组中的行){
$TransDate=$array.Substring(0,10)
$TransTime=$array.Substring(11,5)
$CalcValue=$array.Substring(48)
}
现在$CalcValue给了我一个值列表,尽管我试图将$CalcValue变量转换为double(我有dded.ToDouble和[double],每次都会出错),但还是会出错
所以我的问题是这样的
$InStuff = C:\Work\CR1\AllTransFilter.log
$Null = $InStuff -match '^(?<DateTime>.+),.+Calculated Value: (?<CalcValue>.+)$'
$LogLineData = [PSCustomObject]@{
DateTime = [datetime]$Matches.DateTime
CalcValue = [float]$Matches.CalcValue
}
$LogLineData | Out-Host
'=' * 30
$LogLineData.DateTime | Out-Host
$LogLineData.DateTime.GetType() | Out-Host
'=' * 30
$LogLineData.CalcValue | Out-Host
$LogLineData.CalcValue.GetType() | Out-Host
$LogLineData
你能告诉我如何正确地进行foreach吗?我刚刚注意到日志文件中没有实际的输出,我在上面的消毒输出中粘贴了相同的日期,并且在14:25时没有计算值,所以现在我真的很困惑。而
Benjamin Hubbard
指出了最可能的问题来源glitch[grin],您正在使用的方法-.SubString()
-相当慢。如果要对日志中的许多行执行此操作,则切换到某种正则表达式进行解析可能是值得的。以下代码使用命名捕获组和自动变量$Matches
来构建PSCustomObject。它还创建了一个[datetime]
对象,而不是日期字符串和时间字符串
请注意,这只包括将值放入适当的对象。它不包括阈值测试。[grin]
代码的作用是
- 假装在文本文件中阅读
当您确信它正在正常工作时,用“<代码>获取内容< /代码> >调用该部分[替换到“空白代码行”之前的“空白行”>“调用内容”/代码>调用以加载您的真实文件而不是测试数据。 - 遍历生成的文本行集合
- 在行上运行正则表达式匹配以生成命名的捕获组
这些将自动存储在自动变量
中$Matches
- 使用所需的属性构建一个
[PSCustomObject]
如果您希望在不同的道具中显示日期和时间,则需要修改正则表达式或独立计算这两项 - 将datetime字符串转换为datetime对象
- 将其分配给适当的属性[grin]
- 对计算值数据执行相同的操作
- 将新的自定义对象发送到
集合$Results
- 在屏幕上显示该集合
# fake reading in a text file
# in real life, use Get-Content
$InStuff = @'
2019-11-12 07:58:34,684 DEBUG Calculated Value: 6.41
2019-11-12 08:00:59,823 DEBUG Calculated Value: 24.79
2019-11-12 08:02:44,364 DEBUG Calculated Value: 37.18
2019-11-12 08:06:16,075 DEBUG Calculated Value: 4.95
2019-11-12 08:08:01,202 DEBUG Calculated Value: 32.84
2019-11-12 08:28:31,369 DEBUG Calculated Value: 30.98
2019-11-12 09:29:21,013 DEBUG Calculated Value: 15.27
2019-11-12 09:31:41,489 DEBUG Calculated Value: 6.01
2019-11-12 09:58:21,990 DEBUG Calculated Value: 8.32
2019-11-12 12:13:49,691 DEBUG Calculated Value: 7.63
2019-11-12 15:03:53,459 DEBUG Calculated Value: 6.83
2019-11-12 18:48:07,583 DEBUG Calculated Value: 7.62
2019-11-12 20:23:49,272 DEBUG Calculated Value: 173.53
2019-11-13 06:49:22,654 DEBUG Calculated Value: 3.09
2019-11-13 06:50:45,921 DEBUG Calculated Value: 8.1
'@ -split [System.Environment]::NewLine
$Results = foreach ($IS_Item in $InStuff)
{
$Null = $IS_Item -match '^(?<DateTime>.+),.+Calculated Value: (?<CalcValue>.+)$'
[PSCustomObject]@{
DateTime = [datetime]$Matches.DateTime
CalcValue = [float]$Matches.CalcValue
}
}
$Results
虽然本杰明·哈伯德(Benjamin Hubbard)已经指出了你的小毛病最可能的根源[grin],但你正在使用的方法-
.SubString()
-相当慢。如果要对日志中的许多行执行此操作,则切换到某种正则表达式进行解析可能是值得的。以下代码使用命名捕获组和自动变量$Matches
来构建PSCustomObject。它还创建了一个[datetime]
对象,而不是日期字符串和时间字符串
请注意,这只包括将值放入适当的对象。它不包括阈值测试。[grin]
代码的作用是
- 假装在文本文件中阅读
当您确信它正在正常工作时,用“<代码>获取内容< /代码> >调用该部分[替换到“空白代码行”之前的“空白行”>“调用内容”/代码>调用以加载您的真实文件而不是测试数据。 - 遍历生成的文本行集合
- 在行上运行正则表达式匹配以生成命名的捕获组
这些将自动存储在自动变量
中$Matches
- 使用所需的属性构建一个
[PSCustomObject]
如果您希望在不同的道具中显示日期和时间,则需要修改正则表达式或独立计算这两项 - 将datetime字符串转换为datetime对象
- 将其分配给适当的属性[grin]
- 对计算值数据执行相同的操作
- 将新的自定义对象发送到
集合$Results
- 在屏幕上显示该集合
# fake reading in a text file
# in real life, use Get-Content
$InStuff = @'
2019-11-12 07:58:34,684 DEBUG Calculated Value: 6.41
2019-11-12 08:00:59,823 DEBUG Calculated Value: 24.79
2019-11-12 08:02:44,364 DEBUG Calculated Value: 37.18
2019-11-12 08:06:16,075 DEBUG Calculated Value: 4.95
2019-11-12 08:08:01,202 DEBUG Calculated Value: 32.84
2019-11-12 08:28:31,369 DEBUG Calculated Value: 30.98
2019-11-12 09:29:21,013 DEBUG Calculated Value: 15.27
2019-11-12 09:31:41,489 DEBUG Calculated Value: 6.01
2019-11-12 09:58:21,990 DEBUG Calculated Value: 8.32
2019-11-12 12:13:49,691 DEBUG Calculated Value: 7.63
2019-11-12 15:03:53,459 DEBUG Calculated Value: 6.83
2019-11-12 18:48:07,583 DEBUG Calculated Value: 7.62
2019-11-12 20:23:49,272 DEBUG Calculated Value: 173.53
2019-11-13 06:49:22,654 DEBUG Calculated Value: 3.09
2019-11-13 06:50:45,921 DEBUG Calculated Value: 8.1
'@ -split [System.Environment]::NewLine
$Results = foreach ($IS_Item in $InStuff)
{
$Null = $IS_Item -match '^(?<DateTime>.+),.+Calculated Value: (?<CalcValue>.+)$'
[PSCustomObject]@{
DateTime = [datetime]$Matches.DateTime
CalcValue = [float]$Matches.CalcValue
}
}
$Results
应该是
$line.Substring
而不是$array.Substring
。应该是$line.Substring
而不是$array.Substring
@CarlosFandango-如果没有看到该文件的示例和所讨论的代码,我就无法说出失败的原因。代码在上面,文件就是您多次使用的行h在其自己的行上,但具有连续的时间和日期以及不同的计算值value@CarlosFandango-您需要遍历$InStuff
集合。您发布的数据只有一行…因此演示仅用这一行完成。[grin]将解析代码包装在一个foreach
中,以迭代整个集合。我仍然无法使用整个日志文件而不是行,for each循环抛出错误您无法在空值表达式上调用方法
DateTime CalcValue
-------- ---------
12/11/2019 14:25:11 0.04
==============================
12 November 2019 14:25:11
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DateTime System.ValueType
==============================
0.04
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Single System.ValueType
# fake reading in a text file
# in real life, use Get-Content
$InStuff = @'
2019-11-12 07:58:34,684 DEBUG Calculated Value: 6.41
2019-11-12 08:00:59,823 DEBUG Calculated Value: 24.79
2019-11-12 08:02:44,364 DEBUG Calculated Value: 37.18
2019-11-12 08:06:16,075 DEBUG Calculated Value: 4.95
2019-11-12 08:08:01,202 DEBUG Calculated Value: 32.84
2019-11-12 08:28:31,369 DEBUG Calculated Value: 30.98
2019-11-12 09:29:21,013 DEBUG Calculated Value: 15.27
2019-11-12 09:31:41,489 DEBUG Calculated Value: 6.01
2019-11-12 09:58:21,990 DEBUG Calculated Value: 8.32
2019-11-12 12:13:49,691 DEBUG Calculated Value: 7.63
2019-11-12 15:03:53,459 DEBUG Calculated Value: 6.83
2019-11-12 18:48:07,583 DEBUG Calculated Value: 7.62
2019-11-12 20:23:49,272 DEBUG Calculated Value: 173.53
2019-11-13 06:49:22,654 DEBUG Calculated Value: 3.09
2019-11-13 06:50:45,921 DEBUG Calculated Value: 8.1
'@ -split [System.Environment]::NewLine
$Results = foreach ($IS_Item in $InStuff)
{
$Null = $IS_Item -match '^(?<DateTime>.+),.+Calculated Value: (?<CalcValue>.+)$'
[PSCustomObject]@{
DateTime = [datetime]$Matches.DateTime
CalcValue = [float]$Matches.CalcValue
}
}
$Results
DateTime CalcValue
-------- ---------
2019-11-12 7:58:34 AM 6.41
2019-11-12 8:00:59 AM 24.79
2019-11-12 8:02:44 AM 37.18
2019-11-12 8:06:16 AM 4.95
2019-11-12 8:08:01 AM 32.84
2019-11-12 8:28:31 AM 30.98
2019-11-12 9:29:21 AM 15.27
2019-11-12 9:31:41 AM 6.01
2019-11-12 9:58:21 AM 8.32
2019-11-12 12:13:49 PM 7.63
2019-11-12 3:03:53 PM 6.83
2019-11-12 6:48:07 PM 7.62
2019-11-12 8:23:49 PM 173.53
2019-11-13 6:49:22 AM 3.09
2019-11-13 6:50:45 AM 8.1