【问题标题】:Take a line from one csv file and split it into columns for another csv file using powershell从一个 csv 文件中取出一行并使用 powershell 将其拆分为另一个 csv 文件的列
【发布时间】:2020-10-06 10:20:17
【问题描述】:

我有一个 csv 文件,其中包含我想提取并作为列添加到单独 csv 文件的行。

这是第一个 csv 文件内容的示例。

我想将第三个逗号和分号之间的所有内容分别作为列添加到此 csv 文件中。

我想要的输出是这个。因为第一个 csv 文件中可能有多个服务器,我想为每个服务器导出一个 csv,但我可以弄清楚这一点。

我一直在玩弄以下,但我无法弄清楚。

Import-CSV $CsvTargetPath | ForEach-Object {
$newData = $_

Import-CSV $CsvSourcePath | ForEach-Object {
    $_.AdditionalDisks.split(";") | ForEach-Object {
        $newRecordProperties = [ordered]@{
            $DriveLetter = $_.split(",")[3]
            $Label = $_.split(",")[4]
            $Filesystem = $_.split(",")[5]   
        }
        $newRecord = new-object psobject -Property $newRecordProperties
        Write-Output $newRecord
    }

    $CsvTargetPath | Add-Member -MemberType NoteProperty -Name DriveLetter -Value $DriveLetter -PassThru
    $CsvTargetPath | Add-Member -MemberType NoteProperty -Name Label -Value $Label -PassThru
    $CsvTargetPath | Add-Member -MemberType NoteProperty -Name Filesystem -Value $Filesystem -PassThru
}      
} | Export-CSV $CsvTargetPath -NoTypeInformation

这是第一个 csv 的纯文本内容。

VmName  AdditionalDisks
Server01    90,0,thick,b,sql backup,refs;110,1,thick,d,sql data,refs;60,2,thick,f,sql transaction log,refs;50,3,thin,l,sql audit,refs;30,0,thick,t,sql tempdb data,refs
Server02    90,0,thick,b,sql backup,refs;110,1,thick,d,sql data,refs;60,2,thick,f,sql transaction log,refs;50,3,thin,l,sql audit,refs;30,0,thick,t,sql tempdb data,refs

【问题讨论】:

  • 请您编辑您的问题并向我们展示(至少)第一个 CSV 文件的前 3 或 4 行作为纯文本(从记事本复制),所以我们不要不必输入您已有的内容?

标签: powershell csv


【解决方案1】:

假设第二个 csv 文件也可以保存多台服务器的信息(否则你怎么知道每个磁盘的 Uuid?),你可以这样做

$additionalDiskInfo = Import-Csv -Path 'D:\Test\file1.csv'
$serverInfo         = Import-Csv -Path 'D:\Test\file2.csv'

$additionalDiskInfo | ForEach-Object {
    $server      = $_.VmName
    $targetItems = $serverInfo | Where-Object { $_.VmName -eq $server }
    $extraDisks  = $_.AdditionalDisks -split ';'
    # make sure you don't run into index errors
    $maxItems = [math]::Min($targetItems.Count, $extraDisks.Count)
    # loop through the arrays and output combined objects
    $result = for ($i = 0; $i -lt $maxItems; $i++) {
        $n1, $n2, $n3, $driveLetter, $label, $fileSystem = $extraDisks[$i] -split ','
        $targetItems[$i] | Select-Object *, 
                                         @{Name = 'DriveLetter'; Expression = {$driveLetter}},
                                         @{Name = 'Label'; Expression = {$label}},
                                         @{Name = 'FileSystem'; Expression = {$fileSystem}}
    } 
    # now write a new csv file for this server
    $result | Export-Csv -Path ('D:\Test\DiskInfo-{0}.csv' -f $server) -NoTypeInformation
}

生成的 csv 文件如下所示

"VMName","Harddisk","Uuid","DriveLetter","Label","FileSystem"
"Server01","Hard disk 2","600C293-7e48-3a63-fb02-cd44df98fe79","b","sql backup","refs"
"Server01","Hard disk 3","600C293-7e48-3a63-fb02-cd44df98f454","d","sql data","refs"
"Server01","Hard disk 4","600C293-7e48-3a63-fb02-cd44df98f10a","f","sql transaction log","refs"
"Server01","Hard disk 5","600C293-7e48-3a63-fb02-cd44df98f483","l","sql audit","refs"
"Server01","Hard disk 6","600C293-7e48-3a63-fb02-cd44df98fced","t","sql tempdb data","refs"

【讨论】:

    【解决方案2】:

    试试这样:

    $csv=Import-Csv $CsvSourcePath
    $csv|%{
    [pscustomobject][ordered]@{
    DriveLetter=($_.AdditionalDisks.Split(","))[3]
    Label=($_.AdditionalDisks.Split(","))[4]
    FileSystem=($_.AdditionalDisks.Split(","))[5]
    }}|export-csv $CsvTargetPath -append
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 2019-10-05
      • 1970-01-01
      • 2021-06-08
      • 2018-03-30
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多