正在尝试将.log转换为.xm

2024-05-27 11:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在寻找各种方法将6个20 MB的.log文件转换为.xml

有人给我推荐了在线转换器,它不会转换。在

其他人说使用EXCEL的开发工具,但是

  1. 数据格式不正确

  2. 将20 MB的数据复制并粘贴到EXCEL上需要花费的时间

我想有两个选择:

  1. 在powershell中,将每一行存储为一个数组,然后对于reach line array,创建另一个数组,但是行格式不一致,如您所见

  2. 研究如何使用php或python转换为xml

这是数据格式

06/01 01:25:58 [2024:2588] 10.4.10.10<AgentInfo DomainID="8CB49C910AFB16720044B53CD014E7D9" AgentType="105" UserDomain="MYAWESOMEDOMAIN.ORG" LoginUser="admIN" ComputerDomain="myAWESOMEDOMAIN.org" ComputerName="AWESOMES001" PreferredGroup="My%20Company%5cServers%5cGUP" PreferredMode="1" KnownClientID="C35A5B1E0AFB16760019AE74888EA38A" HardwareKey="46E04E5469DC41949F33E73FDC0C5FCF" IsNPVDIClient="0" SiteDomainName=""/>

06/01 01:26:07 [2024:3280] 10.24.10.97<AgentInfo DomainID="8CB49C910AFB16720044B53CD014E7D9" AgentType="105" UserDomain="LocalComputer" LoginUser="Student%208" ComputerDomain="WORKGROUP" ComputerName="DC9Spartan" PreferredGroup="My%20Company%5cDefault%20Group" PreferredMode="1" HardwareKey="208B60B45CE2D02192B2FBB30CA1470A" SiteDomainName=""/>

06/01 01:26:07 [2024:3280] 10.24.10.97<AgentInfo DomainID="8CB49C910AFB16720044B53CD014E7D9" AgentType="105" UserDomain="LocalComputer" LoginUser="Student%208" ComputerDomain="WORKGROUP" ComputerName="DC9Spartan" PreferredGroup="My%20Company%5cDefault%20Group" PreferredMode="1" HardwareKey="208B60B45CE2D02192B2FBB30CA1470A" SiteDomainName=""/> AgentID=2C26221A0AFB167201AE7F6B29E365AD AgentType=105 ComputerID=1E6BFEF50AFB167201AE7F6BBA576A0C Hash Key=69C6250108E5B7FBB6ACF8294B6564FE

06/01 01:26:19 [2024:2748] 10.21.36.6<AgentInfo DomainID="8CB49C910AFB16720044B53CD014E7D9" AgentType="105" UserDomain="LocalComputer" LoginUser="student" ComputerDomain="WORKGROUP" ComputerName="DingDing9461JZ6" PreferredGroup="My%20Company%5cDefault%20Group" PreferredMode="1" HardwareKey="C6D4F00C9C2952182D8DAB03045C6E30" SiteDomainName=""/>

06/01 01:26:19 [2024:2748] 10.21.36.6<AgentInfo DomainID="8CB49C910AFB16720044B53CD014E7D9" AgentType="105" UserDomain="LocalComputer" LoginUser="student" ComputerDomain="WORKGROUP" ComputerName="DingDing9461JZ6" PreferredGroup="My%20Company%5cDefault%20Group" PreferredMode="1" HardwareKey="C6D4F00C9C2952182D8DAB03045C6E30" SiteDomainName=""/> AgentID=BBF24AB00AFB167200D94A8E46E57D3C AgentType=105 ComputerID=1B4EF5B30AFB167200D94A8E8EBB8E65 Hash Key=6BAC96603C7495DE08E5F305EEF310EE

06/01 01:26:33 [2024:3376] 5 Server returned: 500 Internal Server Error

06/01 01:26:33 [2024:3376] 10.16.64.16<AgentInfo DomainID="ACD6E7230AFB160401B335F917AFF5BE" AgentType="105" UserDomain="LocalComputer" LoginUser="admin" ComputerDomain="myAWESOMEDOMAIN.org" ComputerName="LLR0MGVY" PreferredGroup="My%20Company%5cDefault%20Group" PreferredMode="1" HardwareKey="EFDBD800D66488B08936A51F19B5496A" IsNPVDIClient="0" SiteDomainName=""/>--FAILED

我正在尝试将IP地址与其他数据关联起来,如DomainID,等等。 它变得复杂了,因为有一行有一些服务器错误消息,然后下一行列出了IP地址

我在想,如果我可以使用XML格式,那么查询数据会更容易。或者有没有其他方法来完成我正在尝试的事情?在

谢谢你

输出

我不太熟悉XML,但我想我要寻找的输出是

^{pr2}$

Tags: 数据方法domainidloginusercomputernameworkgroupagenttypeuserdomain
3条回答

{1{cdi>的解决方案很可能是为了把XML{1}转换成一个非常简单的XML文件,而不是使用cdl格式的XML文件。在

$InputData = Get-Content 'C:\Path\To\File.log'

$Records = @{}
$InputData | ?{$_ -match "^(?<Date>\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) (?<ID>\[.+?\]) (?<IP>\S+)\<AgentInfo (?<AgentInfo>.+?)\/\>" -or $_ -match "^(?<Date>\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) (?<ID>\[.+?\]) (?<Msg>.+)"}|
    %{$Record = [pscustomobject]@{
            [string]'Date'=$Matches['Date']
            [string]'ID'=$Matches['ID']
            [string]'IP'=$Matches['IP']
            [string]'Msg'=$Matches['Msg']
            'AgentInfo'=New-Object PSObject -Prop ($Matches['AgentInfo'] -replace '(?<=") ',"`r`n" | ConvertFrom-StringData)
        }
    $record
    If($Matches['ID'] -notin $Records.Keys){
        $Records.Add($Matches['ID'], $Record)
        }Else{
            $Record|Get-Member -MemberType Properties | Where{![string]::IsNullOrEmpty($Record.($_.Name))} | ForEach{$Records."$($Matches['ID'])"|Add-Member "$($_.Name)" $Record.$($_.Name) -Force}
        }
}

$records.Values|select Date,ID,IP,Msg,AgentInfo|convertto-xml -Depth 2 -NoTypeInformation -as Stream|%{$_ -replace 'Property Name="(.+?)(?=">)"(.*)Property(?=>)','$1$2$1' -replace 'Property Name="(.+?)"(?= />)','$1' -replace '<Property Name="(.+?)">','<$1>' -replace '</Property>','</AgentInfo>'} | Set-Content C:\Path\To\OutFile.xml

将输出:

^{pr2}$

这与您想要的输出非常接近。在

我肯定会用Python。在

像这样:

import sys


inFile = sys.argv[1]
inFile = open(inFile,'r')
parser = inFile.readlines()
outFile = open('[your_path]\\converted.xml', 'w')      

for i in parser:
   slice = i.split(' ') #split each line at spaces and do stuff with each slice
   outFile.write("<date>" + slice[0] + "</date>" + '\n')
   outFile.write("<time>" + slice[1] + "</time>" + '\n')
and so on...

XMLWriter Api是为此类工作而设计的xmlapi。下面是一个让您入门的示例:

$xml = new XMLWriter();
$xml->openUri($output);
$xml->startDocument();
$xml->setIndent(2);
$xml->startElement('log');

$file = fopen($input, 'r');
while (FALSE !== ($line = fgets($file))) {
  if (FALSE !== ($p = strpos($line, '<'))) {
    $xml->startElement('line');
    $xml->writeElement('date', substr($line, 0, $p - 1));
    $xml->writeRaw(substr($line, $p));
    $xml->endElement();
  }
}
$xml->endElement();
$xml->endDocument();
$xml->flush();

输出:

^{pr2}$

您将需要一个document元素,每个条目/行的元素都是一个好主意。我只把它分成两个基本部分。根据目标XML格式,您需要添加更多的逻辑(可能是Regex)。代理信息是一个XML元素/文档,因此可以将其复制(原始)到目标XML。在

XMLWriter不是PHP独有的API,您可以找到许多语言的实现。在

相关问题 更多 >

    热门问题