我需要解析一个标签分隔的文本文件,从十六进制转换为十进制,绘制特定的值,然后计算有效值



我从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小时内通常会有几百行这样的值)。最后我需要计算该地块的均方根值。

我一直在用系统上的工具解析日志文件来手工完成大部分工作,它来自于只显示这些行中有44 CT_CCS,然后将其导出到一个制表符分隔的文本文件,将文本文件导入excel电子表格,进一步将括号中的值提取到一个新列中并将其转换为小数,然后用数据透视表绘制它们。RMS计算是我需要加入的一个新步骤。

由于目前我需要为大约43个系统执行此操作,并且将持续需要执行此操作,因此我希望尽可能地自动化此操作。Perl或PowerShell是我想尝试的。如有任何意见或建议,我将不胜感激。

所以themad技术员写了下面的代码来帮助我:

获取内容D: Temp GIM_63_Project 数据Parsing_Script * . txt |{$ _匹配"( D {4} - D {2} D {2}) s ( D {2}: D {2}: D {2}) sCT_CCS s44 s ((?))"}| % {$Record= New-Object -TypeName PSObject$Record | Add-Member -MemberType NoteProperty -Name "Date" -Value ([datetime]::ParseExact($Matches[1],"yyyy-MM-dd",$null).ToString("MM/dd/yyyy"))$Record | Add-Member -MemberType NoteProperty -Name "TimeStamp" -Value ([datetime]::ParseExact($Matches[2],"HH:mm:ss",$null).ToString("HH:mm:ss"))$Record | Add-Member -MemberType NoteProperty -Name "Data" -Value ($Matches[3])。分割(" ")[4 . .5] -join "|%{[Convert]::ToInt32($_,16)})美元的记录} | Export-CSV D:DataTempGIM_63_ProjectParsing_Scriptstep1.csv -NoTypeInformation

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

我不知道怎么做

老实说,我不知道绘图和RMS位,但其余的在PowerShell中真的很容易。

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

Get-Content C:PathToFile.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输出自定义对象数组的属性(时间戳和数据),实际是一个DateTime对象从日期和时间的字符串解析上市,和的十进制值5日,6日,7日和8日十六进制字节(一起捣碎,虽然我不知道你想要的或希望他们添加,或什么)括号内的任何指定的文件中,有"44 CT_CCS"字符串在括号紧随其后。在文件中创建一些随机的假数据(列出的第三个是您的确切示例行),为我输出以下内容:

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:PathToNewFile.csv -NoTypeInformation将其管道到CSV文件。

就像我说的,我对绘制或RMS位一无所知,但这至少给了你一对对可以绘制和转换的数字。也许其他人可以帮忙做剩下的事。

至于个位、十位、百位和千位……$Matches[2].Split(" ")从()中获取所有内容,并从中创建一个数组。我将其管道到ForEach循环(别名%),该循环对指定的每个十六进制数字对执行[Convert]::ToInt32($_,16)。我指定记录[4..7],这是第5到第8个数字对。在你的例子中是08,64,000和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 

Edit: Ok,使用上面的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:DataTempGIM_63_ProjectParsing_Script*.txt | Where{$_ -match "(d{4}-d{2}-d{2})s(d{2}:d{2}:d{2})sCT_CCSs44s((.*?))"}|%{
    [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:DataTempGIM_63_ProjectParsing_Scriptstep1.csv -NoTypeInformation