我有很多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仅包含前两列(关键步骤)。任何帮助都会非常感激,我为这个问题的长篇大论道歉。
答案 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
。
那就是说,如果我正确地阅读它,你想要:
我不会为此使用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标题和双引号值。