使用映射到表覆盖平面文件(例如,csv)

时间:2014-04-09 19:08:38

标签: powershell csv

我在文本文件中跟踪了几百个条目,如下所示:

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

问题是,在excel或其他应用程序中是否有工具或一些简单的方法来执行此操作。我知道编写一个简单的算法很容易,不幸的是我无法走那条路。 Powershell会是一个选择但我不擅长如果你有任何关于如何接近这条路线的提示,请告诉我。

3 个答案:

答案 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