如何在CSV中移动列值并添加新值

时间:2017-06-27 12:12:06

标签: powershell csv

我必须使用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  

2 个答案:

答案 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字符串和匹配的内容构建的。