我从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