我需要解析制表符分隔的文本文件,从十六进制转换为十进制,绘制特定值,然后计算RMS值

时间:2014-08-06 21:00:11

标签: perl parsing powershell

自1984年左右以来我没有编码,所以感觉有点失落。我花了一天时间来审查这个和其他网站,但在这一点上感觉比我开始时更加迷失。我需要自动解析制表符分隔的文本文件。我需要信息的文本行如下所示:

I  24-Jan-14 06:56:53   44  CT_CCS           0   <I> (E 01 13 2C 08 64 00 00) Waterflow monitoring

文本(日志)文件将包含各种其他条目,这些条目对于我目前不感兴趣的目的。我只对其中包含44 CT_CCS的行感兴趣。

我需要转换括号(E 01 13 2C 08 64 00 00)中的一些值,特别是在这种情况下,值08 64占用的参数,从十六进制到十进制。然后我需要随着时间的推移绘制这些值(在给定的24小时内通常会有数百行,例如这一行)。最后,我需要计算图的RMS值。

我通过使用系统中的工具解析日志文件来手动执行大部分操作,只显示其中包含44 CT_CCS的行,然后将其导出到制表符分隔的文本文件,导入文本文件到Excel电子表格,进一步将括号中的值提取到新列并将它们转换为十进制,然后用数据透视表绘制它们。 RMS计算是我需要合并的新步骤。

由于我现在需要为大约43个系统执行此操作,并且将始终需要这样做,我希望尽可能地自动执行此操作。无论是Perl还是PowerShell都是我想要尝试的内容。任何想法或建议都将不胜感激。

所以TheMadTechnician编写了以下代码来帮助我:

Get-Content D:\ Data \ Temp \ GIM_63_Project \ Parsing_Script * .txt | {$ _ -match“(\ d {4} - \ d {2} - \ d {2})\ s(\ d {2}:\ d {2}:\ d {2})\ sCT_CCS \ S44 \ S((*)?)“} |%{     $ Record = New-Object -TypeName PSObject     $记录| Add-Member -MemberType NoteProperty -Name“Date”-Value([datetime] :: ParseExact($ Matches [1],“yyyy-MM-dd”,$ null).ToString(“MM / dd / yyyy”))     $记录| Add-Member -MemberType NoteProperty -Name“TimeStamp”-Value([datetime] :: ParseExact($ Matches [2],“HH:mm:ss”,$ null).ToString(“HH:mm:ss”))     $记录| Add-Member -MemberType NoteProperty -Name“Data”-Value($ Matches [3] .split(“”)[4..5] -join“”|%{[Convert] :: ToInt32($ _,16) })     $记录 } | Export-CSV D:\ Data \ Temp \ GIM_63_Project \ Parsing_Script \ step1.csv -NoTypeInformation

这非常适合解析数据。我发现我的数据中有异常值需要消除。需要消除由以下行产生的值之间的迭代之间的任何增加超过1000:$ Record | Add-Member -MemberType NoteProperty -Name“Data”-Value($ Matches [3] .split(“”)[4..5] -join“”|%{[Convert] :: ToInt32($ _,16) })。

我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

老实说,我不知道绘图和RMS位,但其余部分在PowerShell中非常简单。

您需要Get-Content cmdlet,正则表达式匹配,使用ForEach循环,创建PSCustomObjects和[Convert] :: ToInt32()方法。

Get-Content C:\Path\To\File.csv|Where{$_ -match "(\d{2}-...-\d{2} \d{2}:\d{2}:\d{2}) 44 CT_CCS.*?\((.*?)\)"}|%{[pscustomobject][ordered]@{
    TimeStamp=[datetime]::ParseExact($Matches[1],"dd-MMM-yy hh:mm:ss",$null)
    Data=$Matches[2].split(" ")[4..5] -join ""|%{[Convert]::ToInt32($_,16)}
}}

这将输出一个具有2个属性(TimeStamp和Data)的自定义对象数组,这些属性是从列出的日期和时间字符串解析的实际DateTime对象,以及第5,第6,第7和第8个十六进制字节的十进制值(所有捣碎在一起,虽然我不知道你是否想要或者想要它们被添加,或者什么)在指定文件中具有&#34; 44 CT_CCS&#34;的任何行的括号内。在其中的字符串后跟括号中的内容。在文件中编制一些随机假数据(第三个列出的是您的确切样本行)为我输出以下内容:

TimeStamp                                         Data
---------                                         ----
1/24/2014 6:56:53 AM                              4667
1/24/2014 7:12:04 AM                              43284
1/24/2014 7:31:59 AM                              2148

您可以通过在该代码中的最后一个| Export-CSV C:\Path\To\NewFile.csv -NoTypeInformation之后添加}来将其传输到CSV文件。

正如我所说,我真的不知道有关绘图或RMS位的任何信息,但这至少可以获得你可以绘制和转换的数字对。也许其他人可以协助其他人。

对于Ones,Tens,Hundreds和Thousands ...... $Matches[2].Split(" ")从该行获取()中的所有内容,并从中创建一个数组。我将其传递给ForEach循环(使用的别名%),该循环在指定的每个十六进制数字对上执行[Convert]::ToInt32($_,16)。我指定的记录[4..7]是第5到第8个数字对。在您的示例中,将是08,64,00和00.如果您想要更多,只需将[4..7]更改为您想要包含的内容。如果要将其分解为不同的列,可以添加更多行。如:

    Data=($Matches[2].split(" ")[4..7]|%{[Convert]::ToInt32($_,16)}) -join ""

可能会成为:

    Ones=$Matches[2].split(" ")[4]|%{[Convert]::ToInt32($_,16)}
    Tens=$Matches[2].split(" ")[5]|%{[Convert]::ToInt32($_,16)}
    Hundreds=$Matches[2].split(" ")[6]|%{[Convert]::ToInt32($_,16)}
    Thousands=$Matches[2].split(" ")[7]|%{[Convert]::ToInt32($_,16)}

那将输出(使用我同样的假数据):

TimeStamp            Ones                Tens                Hundreds            Thousands          
---------            ----                ----                --------            ---------          
1/24/2014 6:56:53 AM 18                  59                  0                   0                  
1/24/2014 7:12:04 AM 169                 20                  0                   0                  
1/24/2014 7:31:59 AM 8                   100                 0                   0 

修改:好的,请使用上面TimeStamp=Data=的代码。它现在抓住了0864并将其转换为你喜欢的dec。

使用您的代码编辑:我将您的代码复制并粘贴到我的PowerShell中并对其进行了一些修改(缺少一些\字符)。我跑了它,它运行正常,但我意识到将日期和时间分开可能是一件好事,所以我把它分开了。我用一个名为SomeFile.txt的文本文件运行它,包含以下3行:

I 24-Jan-14 06:56:53 44 CT_CCS 0 (E 01 13 2C 12 3B 00 00) Waterflow monitoring  
I 24-Jan-14 07:12:04 44 CT_CCS 0 (E 01 13 2C A9 14 00 00) Waterflow monitoring  
I 24-Jan-14 07:31:59 44 CT_CCS 0 (E 01 13 2C 08 64 00 00) Waterflow monitoring  

输出包含以下内容的CSV:

"Date","TimeStamp","Data"  
"01/24/2014","06:56:53","4667"  
"01/24/2014","07:12:04","43284"  
"01/24/2014","07:31:59","2148"  

这是我跑来做的代码:

Get-Content D:\Data\Temp\GIM_63_Project\Parsing_Script\*.txt | Where{$_ -match "(\d{4}-\d{2}-\d{2})\s(\d{2}:\d{2}:\d{2})\sCT_CCS\s44\s(\(.*?\))"}|%{
    [pscustomobject][ordered]@{
        Date=[datetime]::ParseExact($Matches[1],"yyyy-MM-dd",$null).ToString("MM/dd/yyyy")
        TimeStamp=[datetime]::ParseExact($Matches[2],"HH:mm:ss",$null).ToString("HH:mm:ss") 
        Data=$Matches[3].split(" ")[4..5] -join ""|%{[Convert]::ToInt32($_,16)}
    }
} | Export-CSV D:\Data\Temp\GIM_63_Project\Parsing_Script\step1.csv -NoTypeInformation