2017-07-28 107 views
-2

我们可以将低于txt文件转换为在最后添加的CSV格式吗?需要使用PowerShell将txt文件转换为CSV(带标题)

文本文件:

 
IP Address: 192.168.1.1 
Hostname: 01-any1TEST 
Event Message: Ping 
Alert Status: Down at least 3 min 
Event Time: 17:25:14 
Alert Type: :Windows 2012 Server 
------------------------------------------------------------------------------------- 
IP Address: 192.168.1.2 
Hostname: 02-any2TEST 
Event Message: Ping 
Alert Status: Down at least 4 min 
Event Time: 17:25:40 
Alert Type: :Unix Server 
------------------------------------------------------------------------------------- 
IP Address: 192.168.1.3 
Hostname: 03-any3TEST 
Event Message: Ping 
Alert Status: Down at least 3 min 
Event Time: 17:26:21 
Alert Type: :windows host 
------------------------------------------------------------------------------------- 

CSV文件输出要求如下:

 
'IP Address','Hostname','Event Message','Alert Status','Event Time','Alert Type' 
'192.168.1.1','01-any1TEST','Ping','Down at least 3 min','17:26:21','Windows 2012 Server ' 
'192.168.1.2','02-any2TEST','Ping','Down at least 3 min','17:26:21','unix host ' 
'192.168.1.3','03-any3TEST','Ping','Down at least 3 min','17:26:21','windows host ' 
+4

它有可能,你有没有做过自己的尝试? – arco444

+0

是的。 $ input = Get-Content -path“path \ Desktop \ in.txt”| Select-String -List'Alert Type','IP Address','Hostname','Event Message','Alert Status','Event Time' $ data = $ input [1 ..($ input.Length - 1 )] $ maxLength = 0 –

+0

$ objects = ForEach($ data in $ data){ $ split = $ record -split“\ s {2,} | \ t +” If($ split.Length -gt $最大长度){$ 最大长度= $ split.Length } $道具= @ {} 对于($ I = 0; $ I -lt $ split.Length; $ I ++){$ props.Add([字符串] ($ I + 1),$分裂[$ i]于) } 新物体-TypeName PSObject -Property $道具 } $标题= [字符串[]](0 .. $最大长度) $ heade rs1 = [String []]('MachineType','EventTime','HostName','IPAddress','AlertMessage','Severity','AlertType','AlertStatus') $ objects | Select-Object $ headers | Export-Csv -NoTypeInformation -Path“path \ out.csv” –

回答

1

这里是你可以做的一种方式:

$logFile = "logfile.txt" 

$delimeterPattern = '^####' 
$recordPattern = '^([^:]+): (.+)' 

# how many lines in a record? 
$recordLines = Select-String $delimeterPattern $logFile -List | 
    Select-Object -ExpandProperty LineNumber 

$logContent = Get-Content $logFile 
for ($i = 0; $i -lt $logContent.Count; $i += $recordLines) { 
    $output = New-Object PSObject 
    for ($j = $i; $j -lt $i + $recordLines; $j++) { 
    $logContent[$j] | Select-String $recordPattern | ForEach-Object { 
     $output | Add-Member NoteProperty $_.Matches[0].Groups[1].Value $_.Matches[0].Groups[2].Value 
    } 
    } 
    $output 
} 

要写入到CSV文件,把上面的脚本,并管道Export-Csv

+0

出现以下错误: export-csv:无法将CSV内容追加到以下文件: C:\ output_temp.csv。附加对象没有对应于以下列的属性 :。要继续使用 不匹配的属性,请添加-Force参数,然后重试 命令。 在线:17 char:12 + $ output | export-csv“$ tempfile”-notypeinformation -append –

+0

如果我添加-force选项仍然低于错误: export-csv:无法处理参数,因为参数“name”的值无效。更改“名称”参数的值并再次运行该操作。 在行:17字符:12 + $输出|出口CSV “$临时文件” -notypeinformation -append -Force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(:) [导出-CSV],PSArgumentException + FullyQualifiedErrorId:参数,Microsoft.PowerShell.Commands.ExportCsvCommand –

+0

你需要把上面的脚本文件,例如名称'getlog.ps1'。运行该脚本,并将脚本的输出传输到CSV;例如'getlog.ps1 | Export-Csv output.csv -NoTypeInformation'。 –

0

我希望这将解决您的问题:

Function Convert2CSV() 
{ 
    param($logFile, $csvFile) 

    "'IP Address','Hostname','Event Message','Alert Status','Event Time','Alert Type'" | Out-File $csvFile 

    get-content $logFile -Delimiter "-------------------------------------------------------------------------------------" | &{ process{ 
     $IsValidMatch=$_ -match "IP Address: (.*)\r\nHostname: (.*)\r\nEvent Message: (.*)\r\nAlert Status: (.*)\r\nEvent Time: (.*)\r\nAlert Type: (.*)\r\n" 
     if($IsValidMatch) 
     { 
      $nextLine="'$($matches[1])','$($matches[2])','$($matches[3])','$($matches[4])','$($matches[5])','$($matches[6])'" | Out-File $csvFile -Append 
     } 
    }} 
} 

最后调用Convert2CSV功能,定义您的日志文件和输出文件作为参数:

Convert2CSV -logFile .\1.txt -csvFile 3.txt 
+0

它只处理文件中的第一条记录。我们需要在这里添加一个循环吗? –

+0

尝试;)。它将继续完整的文件。 – Krisz

0
$delimeterPattern = '^--' 
$recordPattern = '^([^:]+): (.+)' 

$logContent = Get-Content "logfile.txt" 

# how many lines in a record? 
$recordLines = ($logContent | Select-String $delimeterPattern | 
Select-Object -First 1).LineNumber 

for ($i = 0; $i -lt $logContent.Count; $i += $recordLines) { 
$output = New-Object PSObject 
for ($j = $i; $j -lt $i + $recordLines; $j++) { 
$logContent[$j] | Select-String $recordPattern | ForEach-Object { 
    $output | Add-Member NoteProperty $_.Matches[0].Groups[1].Value 
$_.Matches[0].Groups[2].Value 
    } 
} 
$output 
} 

更新后的seprator $ delimeterPattern ='^ - '为$ delimeterPattern ='^ ####'。

+0

你把你的问题你举的例子源数据使用'-',没有''#字符 - 所以当然,我最初发布它没有工作。你必须在你的问题中提供正确的信息。我用'#'更新了我的答案,并且可以将其标记为答案。 –

+0

同意,完成。 –

相关问题