![](/img/trans.png)
[英]Generating Folders based on file names and moving files to a subfolder in the generated folder
[英]Combine file names with folders based on commn value in CSV
寻找有关如何根据两个项目中的共同值将文件与文件夹匹配的指导。 我有一个.csv文件,格式如下:
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
文件将按照(大致)上面显示的顺序排序。 我能够单独从这两个列中获取值,但是我似乎无法弄清楚如何才能真正地做到这一点。
关于如何实现此目标的任何提示/想法/建议? 谢谢!!
** 更新:请参阅下面的说明 **
好的,我会尽力澄清我的问题。
我得到了文件列表以及需要通过电子邮件将其提取到的目的地。 我对这封电子邮件的处理是取出所有文本,只是保留文件名+文件要提取到的目标路径,并将其存储在将由另一个脚本处理的.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文件也要提取到的正确路径来填充path列。 因此,最终结果应为如下所示的.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
如果仍然不清楚,请告诉我。
如果您的每种文件的文件夹都位于同一位置,并且文件名都采用这种格式,就像您的示例一样,这确实很容易。 此答案使用.Split()
方法和计算所得的属性。
$CSVData = Import-Csv data.csv | Select Files,@{l='Paths';e={'C:\Path\To\' + $_.Files.Split('_')[1]}}
如果事情不像您的示例那么简单,我们可以使用它,我们只需要一个更准确的示例和说明。
编辑:好的,查看更新的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.