我有一个具有以下结构的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没问题,但我不确定如何根据文件路径识别该行,并删除/覆盖它。
答案 0 :(得分: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
基于您正在做的事情,更新部分可能很棘手。因此,如果您提供一些有关您正在做的事情的代码,将会很有帮助。
答案 1 :(得分:0)
这是我用来更新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