需要使用PowerShell将txt文件转换为CSV(带标题)
我们可以将低于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 '
这里是你可以做的一种方式:
$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
。
出现以下错误: export-csv:无法将CSV内容追加到以下文件: C:\ output_temp.csv。附加对象没有对应于以下列的属性 :。要继续使用 不匹配的属性,请添加-Force参数,然后重试 命令。 在线:17 char:12 + $ output | export-csv“$ tempfile”-notypeinformation -append –
如果我添加-force选项仍然低于错误: export-csv:无法处理参数,因为参数“name”的值无效。更改“名称”参数的值并再次运行该操作。 在行:17字符:12 + $输出|出口CSV “$临时文件” -notypeinformation -append -Force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(:) [导出-CSV],PSArgumentException + FullyQualifiedErrorId:参数,Microsoft.PowerShell.Commands.ExportCsvCommand –
你需要把上面的脚本文件,例如名称'getlog.ps1'。运行该脚本,并将脚本的输出传输到CSV;例如'getlog.ps1 | Export-Csv output.csv -NoTypeInformation'。 –
我希望这将解决您的问题:
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
它只处理文件中的第一条记录。我们需要在这里添加一个循环吗? –
尝试;)。它将继续完整的文件。 – Krisz
$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 ='^ ####'。
你把你的问题你举的例子源数据使用'-',没有''#字符 - 所以当然,我最初发布它没有工作。你必须在你的问题中提供正确的信息。我用'#'更新了我的答案,并且可以将其标记为答案。 –
同意,完成。 –
它有可能,你有没有做过自己的尝试? – arco444
是的。 $ 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 –
$ 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” –