2017-12-13 6 views
-1

両方のアイテムの共通の値に基づいてファイルをフォルダにどのように一致させるかについてのガイダンスを探しています。 は、私は次の形式である.csvファイルを持っている:CSVのcommn値に基づいてフォルダとファイル名を結合する

Files     Paths 
-----     ----- 
file_JPG_1.zip   C:\path\to\JPG 
file_GIF_1.zip   C:\path\to\GIF 
file_PNG_1.zip   C:\path\to\JPG 
file_PNG_2.zip   C:\path\to\GIF 
file_PNG_3.zip   C:\path\to\JPG 
file_BMP_2.zip   C:\path\to\GIF 
file_JPG_3.zip 
file_GIF_3.zip 
file_PNG_4.zip 
file_PNG_5.zip 
file_PNG_6.zip 
file_BMP_3.zip 

私は「ファイル」ではなく「パス」の完全なリストの完全なリストを持っています。

私がしようとしているのは、ファイル名とフォルダパスの両方に存在するファイルタイプに基づいて.csvファイルの[パス]列にあることです。 基本的に、 'JPG'を含むファイル名には、 'パス'列に貼り付けられた 'JPG'を含む対応するパスがあります。

私が探しているものの最終的な結果は次のようになります。

Files     Paths 
-----     ----- 
file_JPG_1.zip   C:\path\to\JPG 
file_GIF_1.zip   C:\path\to\GIF 
file_PNG_1.zip   C:\path\to\PNG 
file_PNG_2.zip   C:\path\to\PNG 
file_PNG_3.zip   C:\path\to\PNG 
file_BMP_2.zip   C:\path\to\BMP 
file_JPG_3.zip   C:\path\to\JPG 
file_GIF_3.zip   C:\path\to\GIF 
file_PNG_4.zip   C:\path\to\PNG 
file_PNG_5.zip   C:\path\to\PNG 
file_PNG_6.zip   C:\path\to\PNG 
file_BMP_3.zip   C:\path\to\BMP 

ファイルは順番が上に示した(おおよそ)にソートされます。 これらの列の両方から値を得ることはできますが、実際にどのように達成できるかわかりません。

私はこれを達成するためのヒント/アイデア/提案はありますか? ありがとうございます!

** 更新:

[OK]を**明確については以下を参照してください、私は私ができる最善のように私の質問を明確にするつもりです。

電子メールで抽出する必要のあるファイルと宛先のリストが表示されます。 私はこの電子メールで何をしているのですか?すべてのテキストを取り出し、ファイル名とファイルの保存先パスを保存し、別のスクリプトで処理される.CSVファイルに保存するだけです。メールの 形式の線に沿っている。例として、上記を使用して

1. Extract 3452_JPG_FDR_435_DRF1712 - JPG.ZIP to C:\Images\Graphics\JPG\fdr_435 
2. Extract 3452_GIF_FDR_435_DRF1712 - GIF.ZIP to C:\Images\Graphics\GIF\fdr_435 
3. Extract 3452_PNG_FDR_435_DRF1712 - PNG.ZIP to C:\Images\Graphics\PNG\fdr_435 
etc... 

は、私が正しく.CSVファイルを生成することができていますので、私はで終わるだろう:

Files        Paths 
-----        ----- 
3452_JPG_FDR_435_DRF1712 - JPG.ZIP C:\Images\Graphics\JPG\fdr_435 
3452_GIF_FDR_435_DRF1712 - GIF.ZIP C:\Images\Graphics\GIF\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.ZIP C:\Images\Graphics\PNG\fdr_435 
etc... 

メールはその後、読んでいましたよう.Z0xが(これらはWinRarのSFXファイルです)、メールに記載されていたときに問題が来る:私は左午前何

1. Extract 3452_JPG_FDR_435_DRF1712 - JPG.ZIP to C:\Images\Graphics\JPG\fdr_435 
-The following will be automatically extracted: 
3452_JPG_FDR_435_DRF1712 - JPG.Z01 
3452_JPG_FDR_435_DRF1712 - JPG.Z02 
etc... 

は次のようになります.CSVです。

Files              Paths 
-----              ----- 
3452_JPG_FDR_435_DRF1712 - JPG.ZIP       C:\Images\Graphics\JPG\fdr_435 
3452_JPG_FDR_435_DRF1712 - JPG.Z01       C:\Images\Graphics\PNG\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.ZIP       C:\Images\Graphics\BMP\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.Z01       C:\Images\Graphics\GIF\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.Z02       C:\Images\Graphics\RAW\FDR 
3452_BMP_FDR_435_DRF1712 - BMP.ZIP       C:\Images\Graphics\ICO\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.Z01       C:\Images\Graphics\ICO\fdr_120 
3452_BMP_FDR_435_DRF1712 - BMP.Z02       C:\Images\Graphics\ICO\fdr_120 
3452_BMP_FDR_435_DRF1712 - BMP.Z03        
3452_GIF_FDR_435_DRF1712 - GIF.ZIP     
3463_RAW_FDR_DRF1712 - RAW.ZIP        
3457_ICO_fdr_435_STC1712 - ICO.ZIP      
3456_ICO_FDR_435_DRF1712_ICO VO - ICO.ZIP   
3456_ICO_FDR_435_DRF1712_ICO VO - ICO_SET 2.ZIP 

ご覧のとおり、ファイルのパスは並んでいません。 考えてみましょう。.Z0xファイルも同様に抽出される正しいパスでパス列を埋めたいということです。 だから、最終結果がどのように見える.CSVする必要があります:提供されたコードで

Files              Paths 
-----              ----- 
3452_JPG_FDR_435_DRF1712 - JPG.ZIP       C:\Images\Graphics\JPG\fdr_435 
3452_JPG_FDR_435_DRF1712 - JPG.Z01       C:\Images\Graphics\JPG\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.ZIP       C:\Images\Graphics\PNG\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.Z01       C:\Images\Graphics\PNG\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.Z02       C:\Images\Graphics\PNG\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.ZIP       C:\Images\Graphics\BMP\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.Z01       C:\Images\Graphics\BMP\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.Z02       C:\Images\Graphics\BMP\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.Z03       C:\Images\Graphics\BMP\fdr_435 
3452_GIF_FDR_435_DRF1712 - GIF.ZIP       C:\Images\Graphics\GIF\fdr_435 
3463_RAW_FDR_DRF1712 - RAW.ZIP        C:\Images\Graphics\RAW\FDR 
3457_ICO_fdr_435_STC1712 - ICO.ZIP       C:\Images\Graphics\ICO\fdr_435 
3456_ICO_FDR_435_DRF1712_ICO VO - ICO.ZIP     C:\Images\Graphics\ICO\fdr_120 
3456_ICO_FDR_435_DRF1712_ICO VO - ICO_SET 2.ZIP    C:\Images\Graphics\ICO\fdr_120 

、私はこのように見ている私のパス列で終わる:

Paths 
----- 
C:\Images\Graphics\JPG 
C:\Images\Graphics\JPG 
C:\Images\Graphics\PNG 
C:\Images\Graphics\PNG 
C:\Images\Graphics\PNG 
C:\Images\Graphics\BMP 
C:\Images\Graphics\BMP 
C:\Images\Graphics\BMP 
C:\Images\Graphics\BMP 
C:\Images\Graphics\GIF 
C:\Images\Graphics\RAW 
C:\Images\Graphics\ICO 
C:\Images\Graphics\ICO 
C:\Images\Graphics\ICO 

これはまだ不明である場合には、私にお知らせください。

+0

ファイル名は実際には 'file'という単語、ファイルのタイプ、反復強調していますか? – TheMadTechnician

+0

ICO \ fdr_120フォルダの最後の2つはなぜですか?彼らのファイル名には、彼らがすべきことを示唆するものは何もない。それがエラーで、ファイル名が3456_ICO_FDR_120であるか、またはICO \ fdr_435に属している必要があります。私はあなたが望むことをする何かを持っています。 – TheMadTechnician

答えて

3

ファイルの種類ごとにフォルダがすべて同じ場所にあり、ファイル名がすべてこのように書式設定されている場合、これは実際に簡単です。この回答は.Split()メソッドと計算されたプロパティを使用します。

$CSVData = Import-Csv data.csv | Select Files,@{l='Paths';e={'C:\Path\To\' + $_.Files.Split('_')[1]}} 

あなたの例のように操作が簡単でない場合は、より正確な例と説明が必要です。

[編集] [OK]をクリックして、更新されたCSVファイルを見てみましょう。ある列に潜在的なパスのリストと、もう一方の列にファイルのリストがあります。私が示唆しているのは、別の変数にパスのリストを取得することです。次に、それらのパスをキーとしてハッシュテーブルを作成し、パスをバックスラッシュとアンダースコアに分割します(アンダースコアはアンダースコアで、区切りはアンダースコアです)。今度はファイルをループし、それぞれをアンダースコアで分割します。それを分割パスと比較し、最も一致するパスを取る。ここで

はそれをやるスクリプトです:

#Import the CSV 
$CSV = Import-Csv $CSVPath 
#Capture all the unique paths 
$AllPaths = $CSV.Paths | Select -Unique 
#Make an empty hashtable 
$AllPathsSplit = @{} 
#Loop through paths, and add each to the hashtable as a key, with the path split on '\' and '_' as the value 
$AllPaths |%{$AllPathsSplit.Add($_,($_ -split '\\|_'))} 

#Loop through files 
ForEach($File in $CSV){ 
    #Set the path by looking at each item in the hashtable and finding the one with the most matches to the file split on underscores 
    $File.Paths = $AllPaths|Sort {(Compare-Object ($File.Files -split '_') -DifferenceObject $AllPathsSplit[$_] -ExcludeDifferent -IncludeEqual -PassThru).Count} -Descending |Select -First 1 
} 

そして、ここでは出力です:

PS C:\Users\TMTech> $CSV 

Files           Paths       
-----           -----       
3452_JPG_FDR_435_DRF1712 - JPG.ZIP    C:\Images\Graphics\JPG\fdr_435 
3452_JPG_FDR_435_DRF1712 - JPG.Z01    C:\Images\Graphics\JPG\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.ZIP    C:\Images\Graphics\PNG\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.Z01    C:\Images\Graphics\PNG\fdr_435 
3452_PNG_FDR_435_DRF1712 - PNG.Z02    C:\Images\Graphics\PNG\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.ZIP    C:\Images\Graphics\BMP\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.Z01    C:\Images\Graphics\BMP\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.Z02    C:\Images\Graphics\BMP\fdr_435 
3452_BMP_FDR_435_DRF1712 - BMP.Z03    C:\Images\Graphics\BMP\fdr_435 
3452_GIF_FDR_435_DRF1712 - GIF.ZIP    C:\Images\Graphics\GIF\fdr_435 
3463_RAW_FDR_DRF1712 - RAW.ZIP     C:\Images\Graphics\RAW\FDR  
3457_ICO_fdr_435_STC1712 - ICO.ZIP    C:\Images\Graphics\ICO\fdr_435 
3456_ICO_FDR_435_DRF1712_ICO VO - ICO.ZIP  C:\Images\Graphics\ICO\fdr_435 
3456_ICO_FDR_435_DRF1712_ICO VO - ICO_SET 2.ZIP C:\Images\Graphics\ICO\fdr_435 

私は理由があり、ご希望の出力は、最後の2つの項目についての間違いを持っ​​ていることを前提としていますファイル名には何もないので、パスはICO \ fdr_120でなければなりません。

+0

これはほとんど私が後にしたものです!ファイル名自体はシンプルで、先頭と末尾のアンダースコアを使用します。私が言及して忘れたのは、フォルダのパスにはファイルタイプ(JPG、PNGなど)の後ろにディレクトリが含まれているということです。例えば、ディレクトリは次のようになります: 'C:\ folder \ JPG \ abc_123' 'C:\フォルダ\ JPG \ ' C abc_456':\フォルダ\ PNG \ abc_123' 'C:\フォルダ\ GIF \ abc_123' ...というように。 このフォルダ構造は、すでにソースCSVファイルで定義されています。 私はまだファイルの種類の後にフォルダ構造を保持する必要があります。理にかなっている? – obs0lete

+0

より正確なCSVの例を提供するために質問を更新してください。 – TheMadTechnician

+0

私はもう少し質問をクリアするために質問を更新しました。 – obs0lete

関連する問題