【问题标题】:Overwriting CSV in PowerShell在 PowerShell 中覆盖 CSV
【发布时间】:2011-08-17 17:21:44
【问题描述】:

我有一个具有以下结构的 CSV 文档

标题

Path,Publish,Hashlist,Package

内容条目

C:\packages\word.docx, 10:14:17 on 17-08-2011, C:\packages\word.hash, C:\packages\word.zip

现在,我将有多行条目,但我只想在给定时间为每个路径维护一个条目。因此,当我为 C:\packages\word.docx 添加新条目时,我想查找并删除上面的行。我可以在 PowerShell 中附加 .CSV 没问题,但不确定如何根据文件路径识别行,并删除/覆盖它。

【问题讨论】:

  • 那么根据第一个字段,条目应该是唯一的吗?
  • 是的,这就是我想要做的

标签: powershell csv


【解决方案1】:

可能是这样的:

$csv = import-csv test.csv
$tobeupdated = $csv | ?{$_.Path -eq "pathyouarecurrentlyprocessing"}
if($tobeupdated){
    #update
    $tobeupdated.Publish = "blah blah"

} else{
    #add new
    $tobeupdated = New-Object Object 
    $tobeupdated | Add-Member -type NoteProperty -name Path -value "c:\something.docx"
    $tobeupdated | Add-Member -type NoteProperty -name Publish -value "10:14:17 on 17-08-2011"
    $tobeupdated | Add-Member -type NoteProperty -name Hashlist -value "C:\packages\word.hash"
    $tobeupdated | Add-Member -type NoteProperty -name Package -value "C:\packages\word.zip"
    $csv += $tobeupdated
}

$csv | export-csv test.csv -notype

根据您正在做的事情,更新部分可能会很棘手。因此,如果您提供一些有关您正在做什么的代码,将会很有帮助。

【讨论】:

  • 我们需要知道新条目是否也会发生,因为这无法处理全新的条目。
  • @EBGreen - 不想明确说明,因为我不知道 OP 在做什么。但是已经更新了我的答案。感谢您的意见。
  • 抱歉,不是要批评,只是想确保 OP 知道,因为在他的帖子中并不清楚。
  • @EBGreen - 没问题。你是对的,OP 对 SO 来说似乎也是新的,所以我们最好明确一点。
  • 我也在添加新条目,抱歉我没有具体说明。这看起来很棒。非常感谢您的帮助。
【解决方案2】:

这是我用于更新 CSV 文件的工具。一件好事是不需要为添加/更新的每条记录过滤所有 CSV 条目。它使用 HashTable 来存储 CSV 记录的集合。

function Update-MyCSV {
    param(
        [parameter(ValueFromPipeline=$true)]
        $entry,
        $csvPath
    )
    begin {
        $csv = @{}
        if(Test-Path $csvPath) {
            # Import CSV and add to a HashTable
            Import-Csv -Path $csvPath | foreach {$csv["$($_.Path)"] = $_}
        }
    }
    process {
        # Replaces existing entries and adds nonexisting
        $csv[$entry.Path] = $entry
    }
    end {
        # Export to CSV
        $csv.Values | Export-Csv -Path C:\temp\my.csv -NoTypeInformation
    }
}

function New-CsvEntry {
    param(
        $path,
        $publish,
        $hashlist,
        $package
    )
    New-Object Object|
        Add-Member -type NoteProperty -Name Path -Value $path -PassThru |
        Add-Member -type NoteProperty -Name Publish -value $publish -PassThru |
        Add-Member -type NoteProperty -Name Hashlist -value $hashlist -PassThru |
        Add-Member -type NoteProperty -Name Package -value $package -PassThru
}

# Create new CSV
$entries = @(0..9| foreach {New-CsvEntry "C:\packages\word$_.docx" "10:14:1$_ on 17-08-2011" "C:\packages\word$_.hash" "C:\packages\word$_.zip"})
$entries| Update-MyCSV -csvPath C:\temp\my.csv

# Update some CSV records, and create some new
$newEntries = @(7..12| foreach {New-CsvEntry "C:\packages\word$_.docx" "10:14:1$_ on 17-08-2011" "C:\packages\new$_.hash" "C:\packages\new$_.zip"})
$newEntries| Update-MyCSV -csvPath C:\temp\my.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-07
    • 2014-01-10
    • 1970-01-01
    • 2018-06-29
    • 2020-08-24
    • 2016-12-27
    • 2021-04-25
    • 2018-08-27
    相关资源
    最近更新 更多