繁体   English   中英

根据CSV中的逗号值将文件名与文件夹合并

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM