Перезапись CSV в PowerShell - PullRequest
       2

Перезапись CSV в PowerShell

1 голос
/ 17 августа 2011

У меня есть 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, я хочу найти и удалить строку выше. Я могу добавить .CSV без проблем в PowerShell, но не уверен, как определить строку на основе пути к файлу и удалить / перезаписать ее.

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Примерно так:

$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

Обновление может быть сложным в зависимости от того, что вы делаете.Так что будет полезно, если вы дадите некоторый код о том, что вы делаете.

0 голосов
/ 18 августа 2011

Это то, что я использую для обновления файлов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...