2012-03-16 9 views
1

私はCSVファイルを生成するスクリプトを持っています。スクリプトの目的は、特定のファイルがないかどうかを確認することです。たとえば、のは、私は、次のファイルを持っているとしましょう:別のCSVファイルのアイテムに基づいて1つのCSVからアイテムを削除する

1.jpg 
2.jpg 
3.jpg 
4.jpg 

1.gif 
3.gif 

2.txt 
3.txt 

スクリプトが実行されると、私は視覚的に欠けているものをファイル見ることができますので、それはレポートを生成します。レポートは次のようになります。

JPG Files GIF Files TXT Files 
1.jpg  1.gif 
2.jpg     2.txt 
3.jpg  3.gif  3.txt 

私は1.txtと2.gifがありません。私の問題がでてくるのはここ

です....

私は今FIRST CSVで保存しなければならないファイルのリストを持っているSECOND CSVファイルを持っています。 SECOND CSVファイルにないものは、私のFIRST CSVから削除する必要があります。たとえば:

私の最初のCSVが含まれています

1.jpg 
2.jpg 
3.jpg 

1.gif 
3.gif 

2.txt 
3.txt 

SECOND CSVは、以下のファイルが残っている必要があると述べている:

したがって
1.jpg 
3.jpg 

1.gif 

2.txt 

、SECOND CSVファイルに表示されないもの最初のCSVから削除する必要があります。これは、同じ形式を保持しています。つまり、1.jpgが見つからない場合(SECOND CSVにはまだ列挙されていますが、C:\ JPGフォルダには存在しません)最初のCSVで

これは意味があると思います。ご不明な点がございましたら、私にお尋ねください。以下は

FIRST CSVを生成し、私のスクリプトからのコードの一部は次のとおりです。あなたの援助のために事前に

# Get dirs 
$dirJPG = "C:\JPG" 
$dirGIF = "C:\GIF" 
$dirTXT = "C:\TXT" 
$files = @() 
$files += Get-ChildItem -Path $dirBGR -Filter "*.jpg" 
$files += Get-ChildItem -Path $dirMI -Filter "*.gif" 
$files += Get-ChildItem -Path $dirW3F -Filter "*.txt" 


# Write a datetime stamped CSV file 
$datetime = Get-Date -Format "MM_dd_yyyy_hhmm" 
$files | Sort-Object -Property { $_.Name } | Group-Object -Property { 
[System.IO.Path]::GetFileNameWithoutExtension($_.Name) } | % { 
      New-Object psobject -Property @{ 
          "JPG" Files" = $_.Group | ? { $_.Extension -eq ".jpg" } | % { $_.Name } 
          "GIF Files" = $_.Group | ? { $_.Extension -eq ".gif" } | % { $_.Name } 
          "TXT Files" = $_.Group | ? { $_.Extension -eq ".txt" } | % { $_.Name } 
      } } | Export-Csv -Path "$datetime.csv" -NoTypeInformation 

ありがとう! :D

+0

あなたはPowerShellでCSV1とCSV2データを持っていますか、またはあなたはそれが含まれているものを見つけるために、ファイル*からCSV1データ*をロードする必要がありますか? – Ryan

答えて

0

私の問題は何ですか...私は削除する必要があったファイルを呼び出すと、それらを削除していた。私は単純ではない条件を追加するために必要な:

$keys = @() 
$keys += $currentFiles.Keys 
$keys | % { 
    if (! $filesToKeep.ContainsKey($_)) { 
     Write-Host "Removing $_" 
     $currentFiles.Remove($_) 
    } 
} 
1

配列を使用することは可能ですが、ハッシュテーブルを使用する方が効率的です。あなたは最初のCSV項目を反復処理(foreachの)をチェックし、ファイルがCSV1ではなくCSV2にあるかどうかを確認することができます

# Get the files by directory for each file type 
function Get-FilesByType() { 
    param ([hashtable]$filters) 

    $result = @{} 
    foreach ($filter in $filters.Keys) { 
     $path = $filters[$filter] 
     Get-ChildItem -Path $path -Filter $filter | % { 
      $result.Add($_.Name, $_) 
     } 
    } 
    return $result 
} 

# Assume CSV1 hashtable already exists and is loaded 

# Get the hashtable of files for CSV2 
$csv2 = Get-FilesByType @{"*.jpg"="C:\JPG"; "*.gif"="C:\GIF"; "*.txt"="C:\TXT" } 

# Remove items from CSV1 that do not exist in CSV2 
# NOTE: You cannot remove items from the hashtable while 
# iterating through the collection, so use a copy of the 
# keys to iterate. 
$keys = @() 
$keys += $csv1.Keys 
$keys | % { 
    if (! $csv2.ContainsKey($_)) { 
     Write-Host "Removing $_" 
     $csv1.Remove($_) 
    } 
} 

# Write a datetime stamped CSV file 
$datetime = Get-Date -Format "MM_dd_yyyy_hhmm" 
$csv1.Values | Sort-Object -Property { $_.Name } | Group-Object -Property { 
    [System.IO.Path]::GetFileNameWithoutExtension($_.Name) 
} | % { 
    New-Object psobject -Property @{ 
     "JPG Files" = $_.Group | ? { $_.Extension -eq ".jpg" } | % { $_.Name } 
     "GIF Files" = $_.Group | ? { $_.Extension -eq ".gif" } | % { $_.Name } 
     "TXT Files" = $_.Group | ? { $_.Extension -eq ".txt" } | % { $_.Name } 
    } 
} | Export-Csv -Path "$datetime.csv" -NoTypeInformation 
+0

これはうまくいくようですが、CSV1とCSV2のデータを配列にロードしています。私は...しかし、アイデアを次のエラーを取得していますか? [System.Object []]に「Remove」という名前のメソッドが含まれていないため、メソッド呼び出しが失敗しました。ラインで :24文字:21 + $ csv1.Remove <<<<($ _) + CategoryInfo:はInvalidOperation:(削除:文字列)[]、RuntimeExceptionが + FullyQualifiedErrorId:ところで助けを – ntamm

+0

感謝をMethodNotFound – ntamm

+0

私はハッシュテーブルを使ってデモする答えを更新しました。 – Ryan

0

配列を使用しないでください - ライアンは言ったようにハッシュテーブルを使用します。配列を要素から削除したい場合、配列は適切な選択肢ではありません。

+0

あなたの返答をありがとう、私はこれを達成する方法の例がありますか?私はまだPowershellをかなり新しくしています。 – ntamm

関連する問題