【问题标题】:Trying to convert .log to .xml尝试将 .log 转换为 .xml
【发布时间】:2015-08-15 09:05:07
【问题描述】:

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

人们将我推荐给无法转换的在线转换器。

别人说用EXCEL的开发工具,但是

  1. 数据格式不正确

  2. 将 20 MB 的数据复制并粘贴到 EXCEL 上需要 永远

我正在考虑两种选择:

  1. 在powershell中,将每一行存储为一个数组,然后对于到达行数组,创建另一个数组,但是行格式并不一致,你会看到

  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 等其他数据相关联。 它变得复杂,因为有一行有一些服务器错误消息,然后 NEXT 行列出了 IP 地址,

我在想如果我能进入 XML 格式,查询数据会更容易。还是有另一种方法来完成我想做的事情?

谢谢

输出

我对 XML 不太熟悉,但我想我正在寻找的输出是

<Date>06/01 01:25:58
<ID>[2024:2588]
<IP>10.4.10.10</IP>
<AgentInfo>
<DomainID></DomainID>
<AgentType></AgentType>
<UserDomain></UserDomain>
<LoginUser></LoginUser>
etc, etc, the other fields within AgentInfo
</AgentInfo>
</ID>
</Date>


<Date>06/01 01:26:33
<ID>[2024:3376]
<IP>10.16.64.16</IP>
<Msg>5 Server returned: 500 Internal Server Error</Msg>
</ID>
</Date>

【问题讨论】:

  • 显示你想要的输出
  • @splash58 帖子已更新

标签: php python xml excel powershell


【解决方案1】:

我将提供一个使用 RegEx 的 PowerShell 解决方案,ConvertFrom-StringData(可能已经使用 XML 类型来转换 AgentInfo,但这对我的解决方案来说更简单),以及一个对象的 HashTable,用于将记录收集到对象中,然后我将其转换为 XML,并对其进行清理,因为 PowerShell 的 ConvertTo-XML cmdlet 过于冗长恕我直言。

$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

这将输出:

<?xml version="1.0"?>  
<Objects>  
<Object>  
  <Date>06/01 01:26:19</Date>  
  <ID>[2024:2748]</ID>  
  <IP>10.21.36.6</IP>  
  <Msg />  
  <AgentInfo>  
    <LoginUser>"student"</LoginUser>  
    <ComputerDomain>"WORKGROUP"</ComputerDomain>  
    <ComputerName>"DingDing9461JZ6"</ComputerName>  
    <DomainID>"8CB49C910AFB16720044B53CD014E7D9"</DomainID>  
    <HardwareKey>"C6D4F00C9C2952182D8DAB03045C6E30"</HardwareKey>  
    <SiteDomainName>""</SiteDomainName>  
    <PreferredGroup>"My%20Company%5cDefault%20Group"</PreferredGroup>  
    <AgentType>"105"</AgentType>  
    <PreferredMode>"1"</PreferredMode>  
    <UserDomain>"LocalComputer"</UserDomain>  
  </AgentInfo>  
</Object>  
<Object>  
  <Date>06/01 01:25:58</Date>  
  <ID>[2024:2588]</ID>  
  <IP>10.4.10.10</IP>  
  <Msg />  
  <AgentInfo>  
    <LoginUser>"admIN"</LoginUser>  
    <IsNPVDIClient>"0"</IsNPVDIClient>  
    <ComputerDomain>"myAWESOMEDOMAIN.org"</ComputerDomain>  
    <ComputerName>"AWESOMES001"</ComputerName>  
    <DomainID>"8CB49C910AFB16720044B53CD014E7D9"</DomainID>  
    <HardwareKey>"46E04E5469DC41949F33E73FDC0C5FCF"</HardwareKey>  
    <SiteDomainName>""</SiteDomainName>  
    <PreferredGroup>"My%20Company%5cServers%5cGUP"</PreferredGroup>  
    <AgentType>"105"</AgentType>  
    <KnownClientID>"C35A5B1E0AFB16760019AE74888EA38A"</KnownClientID>  
    <PreferredMode>"1"</PreferredMode>  
    <UserDomain>"MYAWESOMEDOMAIN.ORG"</UserDomain>  
  </AgentInfo>  
</Object>  
<Object>  
  <Date>06/01 01:26:07</Date>  
  <ID>[2024:3280]</ID>  
  <IP>10.24.10.97</IP>  
  <Msg />  
  <AgentInfo>  
    <LoginUser>"Student%208"</LoginUser>  
    <ComputerDomain>"WORKGROUP"</ComputerDomain>  
    <ComputerName>"DC9Spartan"</ComputerName>  
    <DomainID>"8CB49C910AFB16720044B53CD014E7D9"</DomainID>  
    <HardwareKey>"208B60B45CE2D02192B2FBB30CA1470A"</HardwareKey>  
    <SiteDomainName>""</SiteDomainName>  
    <PreferredGroup>"My%20Company%5cDefault%20Group"</PreferredGroup>  
    <AgentType>"105"</AgentType>  
    <PreferredMode>"1"</PreferredMode>  
    <UserDomain>"LocalComputer"</UserDomain>  
  </AgentInfo>  
</Object>  
<Object>  
  <Date>06/01 01:26:33</Date>  
  <ID>[2024:3376]</ID>  
  <IP>10.16.64.16</IP>  
  <Msg>5 Server returned: 500 Internal Server Error</Msg>  
  <AgentInfo>  
    <LoginUser>"admin"</LoginUser>  
    <IsNPVDIClient>"0"</IsNPVDIClient>  
    <ComputerDomain>"myAWESOMEDOMAIN.org"</ComputerDomain>  
    <ComputerName>"LLR0MGVY"</ComputerName>  
    <DomainID>"ACD6E7230AFB160401B335F917AFF5BE"</DomainID>  
    <HardwareKey>"EFDBD800D66488B08936A51F19B5496A"</HardwareKey>  
    <SiteDomainName>""</SiteDomainName>  
    <PreferredGroup>"My%20Company%5cDefault%20Group"</PreferredGroup>  
    <AgentType>"105"</AgentType>  
    <PreferredMode>"1"</PreferredMode>  
    <UserDomain>"LocalComputer"</UserDomain>  
  </AgentInfo>  
</Object>  
</Objects>

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

【讨论】:

  • 第一行不应该是$InputData = Get-Content 'C:\Path\To\File.log'
  • 我想了解$_ -match "^(? 的工作原理。我认为^ 表示不是,因为[^abc] 表示not a, b, or c .... 也试图弄清楚这一点.......
  • 好吧,我认为^ 的意思是“开始于”
  • 是的 $InputData = 位,我更新了它以反映这一点。抱歉,我没有从文件中导入,我将您的示例粘贴为 herestring 并对其进行拆分/解析。至于^,虽然在方括号内表示NOT,但当像我这样使用时,它实际上表示字符串或行的开头
【解决方案2】:

我肯定会使用 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...

【讨论】:

    【解决方案3】:

    XMLWriter Api 是专为此类工作而设计的 XML Api。下面是一个帮助您入门的示例:

    $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();
    

    输出:

    <?xml version="1.0"?>
    <log>
     <line>
      <date>06/01 01:25:58 [2024:2588] 10.4.10.1</date>
    <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=""/>
    </line>
    ...
    

    您将需要一个文档元素,并且每个条目/行的元素都是一个好主意。我只把它分成两个基本部分。您将需要添加更多逻辑(可能是正则表达式),具体取决于您的目标 XML 格式。代理信息是一个 XML 元素/文档,因此可以将其复制(原始)到目标 XML。

    XMLWriter 不是 PHP 独有的 API,您会发现许多语言的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-17
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多