【问题标题】:Adding columns and manipulating existing column values in csv file using powershell使用powershell在csv文件中添加列和操作现有列值
【发布时间】:2018-03-29 01:34:52
【问题描述】:

我有很多 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 仅包含前两列(关键步骤)。任何帮助都将不胜感激,对于这个问题的冗长,我深表歉意。

【问题讨论】:

    标签: powershell csv batch-processing


    【解决方案1】:

    我遇到过想要回答这个问题的问题,它使用每列标题的 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:\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 处理,那么:

    $n = 65536
    $counter = 1
    Import-Csv -LiteralPath 'C:\test\test.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:\test\output.csv' -NoTypeInformation
    

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

    【讨论】:

    • 是的,你是对的,如果可以避免的话,我不希望输出 csv 文件中的标题。这两个脚本都适用于单个 csv 文件,我想知道如何通过管道传输任一脚本来处理目录中的所有文件,因为我有很多 csv。我尝试过包含 Get-ChildItem 命令,但导出的 csv 仅包含文件名列表并且没有处理它们。
    【解决方案2】:

    我会尝试类似的方法,通过使用可计算的脚本属性作为新列扩展原始表:

    #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
    

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 2021-06-18
      • 2015-03-03
      • 2014-02-12
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      相关资源
      最近更新 更多