我在文本文件中跟踪了几百个条目,如下所示:
DisplayName : John, Smith
UPN : MY3043241@domain.local
Status : DeviceOk
DeviceID : ApplC39HJ3JPDTF9
DeviceEnableOutboundSMS : False
DeviceMobileOperator :
DeviceAccessState : Allowed
DeviceAccessStateReason : Global
DeviceAccessControlRule :
DeviceType : iPhone
DeviceUserAgent : Apple-iPhone4C1/902.206
DeviceModel : iPhone
... about 1500 entries of the above with blank line between each.
我希望创建一个包含以上标题的表格: 显示名称,UPN,状态,的DeviceID,DeviceEnableOutboundSMS,DeviceMobileOperator,DeviceAccessState,DeviceAccessStateReason,DeviceAccessControlRule,设备类型,DeviceUserAgent,DeviceModel
答案 0 :(得分:1)
Powershell在这里回答......我使用了一个测试文件C:\ Temp \ test.txt,其中包含:
DisplayName : John, Smith
UPN : MY3043241@domain.local
Status : DeviceOk
DeviceID : ApplC39HJ3JPDTF9
DeviceEnableOutboundSMS : False
DeviceMobileOperator :
DeviceAccessState : Allowed
DeviceAccessStateReason : Global
DeviceAccessControlRule :
DeviceType : iPhone
DeviceUserAgent : Apple-iPhone4C1/902.206
DeviceModel : iPhone
DisplayName : Mary, Anderson
UPN : AR456789@domain.local
Status : DeviceOk
DeviceID : ApplC39HJ3JPDTF8
DeviceEnableOutboundSMS : False
DeviceMobileOperator :
DeviceAccessState : Allowed
DeviceAccessStateReason : Global
DeviceAccessControlRule :
DeviceType : iPhone
DeviceUserAgent : Apple-iPhone4C1/902.206
DeviceModel : iPhone
这样我就可以解析多个记录。然后我针对这个创建空数组$users
的脚本运行它,一次获取该文件的内容13行(12个字段+空行)。然后它创建一个没有属性的自定义对象。然后对于13行中的每一行,如果该行不为空,则为我们刚刚创建的对象创建一个新属性,其中名称是:
之前的所有内容,值是其后的所有内容(从中删除空格)名称和价值的结尾)。然后它将该对象添加到数组中。
$users=@()
gc c:\temp\test.log -ReadCount 13|%{
$User = new-object psobject
$_|?{!([string]::IsNullOrEmpty($_))}|%{
Add-Member -InputObject $User -MemberType NoteProperty -Name ($_.Split(":")[0].TrimEnd(" ")) -Value ($_.Split(":")[1].TrimEnd(" "))
}
$users+=$User
}
填充数组$Users
后,您可以执行以下操作:
$Users | Export-CSV C:\Temp\NewFile.csv -notypeinfo
它为您提供了您期望的CSV。
答案 1 :(得分:1)
对于只有几百条记录的输入文件,我可能会读取整个文件,将其拆分为空行,分隔换行符处的文本块和冒号处的行。有点像这样:
$infile = 'C:\path\to\input.txt'
$outfile = 'C:\path\to\output.csv'
[IO.File]::ReadAllText($infile).Trim() -split "`r`n`r`n" | % {
$o = New-Object -Type PSObject
$_.Trim() -split "`r`n" | % {
$a = "$_ :" -split '\s*:\s*'
$o | Add-Member -Type NoteProperty -Name $a[0] -Value $a[1]
}
$o
} | Export-Csv $outfile -NoType
答案 2 :(得分:1)
虽然我是Powershell单行的忠实粉丝,但对于那些试图学习或开始使用它的人来说,它不会有多大帮助。更多的是在公司环境中获得支持。
我已经编写了一个包含文档的cmdlet,以帮助您入门。
function Import-UserDevice {
Param
(
# Path of the text file we are importing records from.
[string] $Path
)
if (-not (Test-Path -Path $Path)) { throw "Data file not found: $Path" }
# Use the StreamReader for efficiency.
$reader = [System.IO.File]::OpenText($Path)
# Create the initial record.
$entry = New-Object -TypeName psobject
while(-not $reader.EndOfStream) {
# Trimming is necessary to remove empty spaces.
$line = $reader.ReadLine().Trim()
# An empty line would indicate we need to start a new record.
if ($line.Length -le 0 -and -not $reader.EndOfStream) {
# Output the completed record and prepare a new record.
$entry
$entry = New-Object -TypeName psobject
continue
}
# Split the line through ':' to get properties names and values.
$entry | Add-Member -MemberType NoteProperty -Name $line.Split(':')[0].Trim() -Value $line.Split(':')[1].Trim()
}
# Output the residual record.
$entry
# Close the file.
$reader.Close()
}
以下是如何使用它将记录导出为CSV的示例。
Import-UserDevice -Path C:\temp\data.txt | Export-Csv C:\TEMP\report.csv -NoTypeInformation