Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用powershell对文本文件中的日志数据进行排序_Arrays_Powershell_Sorting_Object_Data Manipulation - Fatal编程技术网

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],每次都会出错),但还是会出错

所以我的问题是这样的

  • 这是正确的方法吗?我曾尝试使用自定义标题转换为CSV,但没有成功
  • 有人能给我指点一些阅读材料(noobish?)的方向来操纵数组以实现我的需要吗
  • 获取计算值并确定其是否高于设定值的最佳方法是什么
  • 非常感谢您的帮助

    编辑

    所以使用Lee的代码

    $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