使用powershell在csv文件中添加列和操作现有列值

时间:2018-03-29 01:34:53

标签: powershell csv batch-processing

我有很多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 sort函数,我通常会更改Col2中Yn值的顺序,以便它们在导出的csv中排序,如下所示:

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

使用Col3值作为排序顺序(从最大到最小),然后我删除此列,以便最终保存的csv仅包含前两列(关键步骤)。任何帮助都会非常感激,我为这个问题的长篇大论道歉。

2 个答案:

答案 0 :(得分:0)

我会尝试使用可计算的script-property作为新列扩展原始表:

#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

答案 1 :(得分:0)

  

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

-Header的{​​{1}}参数用于在文件不包含列标题时添加列标题。它需要一个字符串数组,但是有很多列。

  

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

如果您无法使用Import-Csv,则可以将带有-Header的行读入内存,在内存中添加标题,然后在一个脚本中使用Get-Content

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

  • 输入文件中没有标题,我想输出文件中没有标题
  • 添加第三列并对其进行排序和删除的重点只是颠倒这些行?
  • 您保留的唯一列是第1列?

我不会为此使用Import-Csv,它不会使它更好。

ConvertFrom-CSV

如果您确实想使用CSV处理,那么:

$n = 65536

# Read lines into a list, and reverse it
$lines = [Collections.Generic.List[String]](Get-Content -LiteralPath 'c:\test\test.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:\test\output.csv' -Encoding Ascii

但输出将包含CSV标题和双引号值。