2011-08-17 5 views
1

je un document CSV qui est de la structure suivanteÉcrasement CSV dans PowerShell

têtes

Path,Publish,Hashlist,Package 

Entries contenu

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

Maintenant, je vais avoir plusieurs lignes d'entrées, mais Je veux seulement maintenir une entrée par chemin à un moment donné. Donc, quand j'ajoute une nouvelle entrée pour C: \ packages \ word.docx, je veux trouver et supprimer la ligne ci-dessus. Je peux ajouter le .CSV sans problème dans PowerShell, mais je ne sais pas comment identifier la ligne basée sur le chemin du fichier, et le supprimer/l'écraser.

+0

Les entrées doivent donc être uniques en fonction du premier champ? – EBGreen

+0

oui c'est ce que j'essaie de faire –

Répondre

1

Quelque chose comme ça peut-être:

$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 

La partie mise à jour peut-être difficile en fonction de ce que vous faites. Il sera donc utile de donner un code sur ce que vous faites.

+0

Nous aurions besoin de savoir si de nouvelles entrées vont se passer aussi car cela ne gèrerait pas une entrée complètement nouvelle. – EBGreen

+0

@ EBGreen - Je ne voulais pas l'avoir explicitement car je ne savais pas ce que l'OP faisait. Mais j'ai mis à jour ma réponse. Merci pour la contribution. – manojlds

+0

Désolé, n'essayait pas de critiquer, je voulais juste être sûr que l'OP était au courant car ce n'était pas clair dans son message. – EBGreen

0

C'est ce que j'utilise pour mettre à jour les fichiers CSV. Une bonne chose à ce sujet est que toutes les entrées CSV n'ont pas besoin d'être filtrées pour chaque enregistrement ajouté/mis à jour. Il utilise un HashTable pour stocker la collection d'enregistrements 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