自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) })。
我不知道该怎么做。
答案 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