1

我有一个包含以下信息的 csv 文件:

OS Name:                   Microsoft© Windows Server© 2008 Standard 
OS Version:                6.0.6002 Service Pack 2 Build 6002
System Manufacturer:       IBM
System Model:              IBM 3850 M2 / x3950 M2 -[7233Z1H]-

我需要使用 powrshell 来读取和格式化显示。我现有的代码是这样的:

$Array = @()
Get-Content <txtfilename> | foreach {
$Test = $_
$Title = $Test.split(":")[0]
$Content = $Test.split(":")[1]
$Obj = New-Object System.Object
$Obj | Add-Member -MemberType NoteProperty -value $Title -Name Title
$Obj | Add-Member -MemberType NoteProperty -value $Content -Name Value
$Array += $Obj
}

$Array | Select Title,Value | Export-Csv <csvfilename> -NoTypeInformation

它显示的信息如下所列:

Title      Content
OS Name                         Microsoft? Windows Server? 2008 Standard 
OS Version                      6.0.6002 Service Pack 2 Build 6002
System Manufacturer             IBM
System Model                    IBM 3850 M2 / x3950 M2 -[7233Z1H]-

我需要像这样在一行中显示的信息:

ServerName, OS Name , OS Version,  System Manufacture, Sytem model,
TestServer1, Microsoft Windows, 6.0.6002 Service Pack 2, IBM, IBM 3850

谢谢

4

3 回答 3

0

首先,只是快速更正。你说你有一个CSV。看起来你有一个格式化的文本文件,你想用它制作一个 CSV。

按照这个假设,这样的事情应该让你开始。它假定文本文档中只有这 4 个项目,或者这 4 个项目重复多次 - 总是以相同的顺序,并且它们之间没有空格。如果没有一堆关于它们外观的示例,重新格式化文本文件永远不会有趣。

话虽如此,以下内容应该可以帮助您入门。

[int]$i = 1
$outString = ""
Get-Content C:\users\chris\desktop\info.txt | % {
    #Take the line, remove the title, remove whitespaces from inside of the line and trim whitespaces from the outside.
    $lineContent = ($_.split(':')[1] -replace '\s+', ' ').Trim()
    #Chunk them together...
    if ($i -lt 4){
        $outstring += $linecontent + ','
        $i += 1
    }
    #or insert a return, new line
    else{
        $outstring += $linecontent + "`r`n"
        $i = 1
    }
}
#Add a header row.  Now $outstring is your CSV formatted text.
$outstring = "OSName,OSVersion,SystemMfg,SystemModel`r`n"+$outstring
于 2012-12-10T14:14:37.053 回答
0

这是更高级情况的第二个答案,您不知道您有多少个唯一标题或它们被称为什么。只要它们始终相同且顺序相同,以下内容将起作用:

$filePath = "C:\users\chris\desktop\info.txt"
$headers = @()
[int]$headerCount = 0
$endUnique = $false
Get-Content $filePath | % {
    $header = ($_.split(':')[0] -replace '\s+', ' ').Trim()
    if (($headers -notcontains $header) -and (!$endUnique)){
        $headers += $header
        $headerCount += 1
    }
    else{
        $endUnique = $true
    }
}
$headerRow = ""
$headers | % {$headerRow += $_ + ","}
$headerRow = $headerRow.Substring(0,$headerRow.Length-1)

[int]$i = 1
$outString = ""
Get-Content $filePath | % {
    $lineContent = ($_.split(':')[1] -replace '\s+', ' ').Trim()
    if ($i -lt $headerCount){
        $outstring += $linecontent + ','
        $i += 1
    }
    else{
        $outstring += $linecontent + "`r`n"
        $i = 1
    }
}
$outstring = $headerRow+ "`r`n"+$outstring

我想从更高级的 PowerShell 用户那里看到其他答案。

于 2012-12-10T15:50:12.730 回答
0
$object = New-Object System.Object
Get-Content TestServer1-OSInfo.txt | % {
 If($_.Contains(":")){
    $Left = $_.split(":")[0].TrimStart().TrimEnd()
     $Right = $_.split(":")[1].TrimStart().TrimEnd()
      $object | Add-Member -type NoteProperty -name $Left -value $Right
    }
}
$object | Export-Csv TestServer1-OSInfo.csv -NoTypeInformation
于 2012-12-11T15:10:46.317 回答