从一个csv文件中提取一行,并使用powershell将其拆分为另一个csv文件的列
我有一个csv文件,其中包含我想提取的行,并作为列添加到单独的csv文件中 这是第一个csv文件内容的示例 我想将第三个逗号和分号之间的所有内容都作为列添加到这个csv文件中 我想要的输出是这个。因为在第一个csv文件中可能有多个服务器,所以我想为每个服务器导出一个csv,但我可以计算出来 我一直在玩弄下面的东西,但我搞不懂从一个csv文件中提取一行,并使用powershell将其拆分为另一个csv文件的列,powershell,csv,Powershell,Csv,我有一个csv文件,其中包含我想提取的行,并作为列添加到单独的csv文件中 这是第一个csv文件内容的示例 我想将第三个逗号和分号之间的所有内容都作为列添加到这个csv文件中 我想要的输出是这个。因为在第一个csv文件中可能有多个服务器,所以我想为每个服务器导出一个csv,但我可以计算出来 我一直在玩弄下面的东西,但我搞不懂 Import-CSV $CsvTargetPath | ForEach-Object { $newData = $_ Import-CSV $CsvSourcePa
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=Import-Csv $CsvSourcePath
$csv|%{
[pscustomobject][ordered]@{
DriveLetter=($_.AdditionalDisks.Split(","))[3]
Label=($_.AdditionalDisks.Split(","))[4]
FileSystem=($_.AdditionalDisks.Split(","))[5]
}}|export-csv $CsvTargetPath -append
假设第二个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"
请您编辑您的问题,并以纯文本(从记事本复制)的形式向我们显示(至少)第一个CSV文件的前3或4行,这样我们就不必键入您已有的内容了吗?@Theo,编辑,谢谢。