使用PowerShell添加列并在CSV文件中操纵现有列值



我有很多CSV文件,其值像这样:

X1,Y1
X2,Y2
...,...
Xn,Yn

我发现使用Excel处理这些非常乏味,因此我想设置批处理脚本以处理这些文件,以使它们看起来像这样:

#where N is a specified value like 65536
X1,N-Y1,1
X2,N-Y2,2
...,...,...
Xn,N-Yn,n

我直到最近才开始使用PowerShell进行图像处理(非常简单的脚本(和附加文件名称,因此我不确定该如何处理。我遇到的许多脚本都希望回答此问题,每个列中使用标题为标题的CSV文件,而我的文件只是第一行中没有对象标题的值数组。我想避免运行多个脚本以添加标题。

我的奖励问题是我尚未找到一个很好的答案,这是处理中最乏味的部分。使用Excels排序函数,我通常会更改Col2中YN值的顺序,以便将它们排序在导出的CSV中,例如:

X1,N-Yn,n
...,...,...
Xn-1,N-Y2,2
Xn,N-Y1,1

使用COL3值作为排序顺序(最大到最小(,然后删除此列,以便最终保存的CSV仅包含前两列(关键步骤(。任何帮助都将不胜感激,我为这个问题的长期性而道歉。

我遇到要回答这个问题的问题,每列使用标题为标题的CSV文件,而我的文件只是第一行中没有对象标题的值数组。

当文件不包含它们时,Import-Csv-Header参数用于添加列标题。它需要一系列字符串,但是有很多列。

我想避免运行多个脚本以添加标题。

如果您无法使用-Header,则可以在内存中读取Get-Content的行,在内存中添加标头,然后在一个脚本中使用ConvertFrom-CSV

也就是说,如果我正确地阅读它,您想要:

  • 输入文件中没有标题,我想像输出文件中没有标题
  • 添加第三列并对其进行排序和删除的全部要点只是为了反向行?
  • 您保留的唯一列是第1列?

我不会为此使用import-csv,它不会使它变得更好。

$n = 65536
# Read lines into a list, and reverse it
$lines = [Collections.Generic.List[String]](Get-Content -LiteralPath 'c:testtest.csv')
$lines.Reverse()

# Split each line into two, create a new line with X and N-Y
# write new lines to an output file
$lines | ForEach-Object {
    $x, $y = $_.split(',')
    "$x,$($n - [int]$y)"
} | Set-Content -LiteralPath 'c:testoutput.csv' -Encoding Ascii

如果您想使用CSV处理,则:

$n = 65536
$counter = 1
Import-Csv -LiteralPath 'C:testtest.csv' -Header 'ColX', 'ColY' |
    Add-Member -MemberType ScriptProperty -Name 'ColN-Y' -Value {$n - $_.ColY} -PassThru |
    Add-Member -MemberType ScriptProperty -Name 'N' -Value {$script:counter++} -PassThru |
    Sort-Object -Property 'N' -Descending |
    Select-Object -Property 'ColX', 'ColN-Y' |
    Export-Csv -LiteralPath 'c:testoutput.csv' -NoTypeInformation

,但输出将具有CSV标头和双引号的值。

我会尝试以类似的方式来扩展原始表,并以可计算的脚本 - 托管作为新列:

#Your N number
$N = 65536
# Import CSV file without header columns
$table = Import-Csv -Header @("colX","colY") `
    -Delimiter ',' `
    -Path './numbers.csv'
Write-Host "Original table"
$table | Format-Table
# Manipulate table
$newtable = $table |
Add-Member -MemberType ScriptProperty -Name colNX -Value { $N-$this.colX } - PassThru
Write-Host "New table"
$newtable | Format-Table

最新更新