我必须使用PowerShell在我的CSV数据中创建一个新列。
有我的代码:
$csv = Import-Csv .\test1.csv -Delimiter ';'
$NewCSVObject = @()
foreach ($item in $csv)
{
$NewCSVObject += $item | Add-Member -name "ref" -value " " -MemberType NoteProperty
}
$NewCSVObject | export-csv -Path ".\test2.csv" -NoType
$csv | Export-CSV -Path ".\test2.csv" -NoTypeInformation -Delimiter ";" -Append
当我打开文件时,列在这里但是右边,我想在左边像A栏一样。我不知道我是否可以将这两个对象导出到一行中这(它没有用):
$csv,$NewCSVObject | Export-CSV -Path ".\test2.csv" -NoTypeInformation -Delimiter ";" -Append
输入文件(它的行数多于一行):
A B C D E F G H T-89 T-75 T-22 Y-23 Y-7 Y-71
当前输出文件:
A B C D E F G H Y-23 Y-7 Y-71 ref: ref2:
Excel表中的预期结果,显示" ref:"和"参考:2"在产品列之前:
A B C D E F G H ref: T-89 T-75 T-22 ref2: Y-23 Y-7 Y-71
答案 0 :(得分:0)
您可以使用Select-Object
指定订单。
假设您的标题为A
- H
(我知道代码中的A
应该是ref
,但不知道T-89
等等是你的其他标题)
$NewCSVObject | Select-Object A,B,C,D,E,F,G,H | Export-Csv -Path ".\test2.csv" -NoType
答案 1 :(得分:0)
如果我们只将文件视为平面文本文件并将其保存为csv格式,这可能会更简单。您可以使用csv对象并将值移动到其他行但这不是必需的。您通过Add-Member
添加列的方法无法实现此目标,因为它将添加新的列,并且与您想要的输出不匹配。 Export-CSV
想要写入具有相同属性的文件对象,并将其混合,从而产生意外结果。
这是一种冗长的方式。您可以使用正则表达式(见下文)轻松缩短这一点。我选择了这种方法,因为它更容易跟踪正在发生的事情。
# Equivelent to Get-Content $filepath. This just shows what I am doing and is a portable solution.
$fileContents = "A;B;C;D;E;F;G;H",
"T-89;T-75;T-22;Y-23;Y-7;Y-71",
"T-89;T-75;T-22;Y-23;Y-7;Y-71"
$newFile = "C:\temp\csv.csv"
# Write the header to the output file.
$fileContents[0] | Set-Content $newFile
# Process the rest of the lines.
$fileContents | Select-Object -Skip 1 | ForEach-Object{
# Split the line into its elements
$splitLine = $_ -split ";"
# Rejoin the elements. adding the ref strings
(@("ref:") + $splitLine[0..2] + "ref2:" + $splitLine[3..5]) -join ";"
} | Add-Content $newFile
最后一行是连接一个数组。从“ref:”开始,添加分割线的前3个元素,后跟“ref2:”和其余元素。新数组以分号连接,然后发送到管道以输出到文件。
如果你愿意给正则表达式一个镜头,可以用更少的代码来完成。
$fileContents = Get-Content "C:\source\file\path.csv"
$newFile = "C:\new\file\path.csv"
$fileContents[0] | Set-Content $newFile
($fileContents | Select-Object -Skip 1) -replace "((?:.*?;){3})(.*)",'ref:;$1ref2:;$2' | Add-Content $newFile
这样做是将每一行分成第3个分号(Explanation)上的第一行。替换字符串是根据ref字符串和匹配的内容构建的。