将.csv列中的值匹配并重命名为目录中存在的文件名



当前正在尝试查看是否有一种方法可以将特定.csv列中的条目与目录中的特定文件列表部分匹配,然后重命名匹配的条目,使其准确地表示文件。

例如,如果我有一系列文件如下:

23.54_0.DXF
24.58_0.1.DXF
25.01_0.DXF 

.csv列中的条目为:

23.54 - Gusset
24.58 - shell plate
25.01 - reopad

我想将.csv条目重命名为:

23.54_0.DXF
24.58_0.1.DXF
...

我已经看到了很多相反场景的例子(基于.csv列重命名文件(,但似乎找不到一个例子来代表我在这里试图实现的目标。

以下允许我将.csv条目获取为";匹配";当版本号不变时的文件名(零件名后面的"_X"(,但它不像我让它按上面描述的那样灵活:

$rev=gci -path "$FolderPath" -Filter *.DXF | Select-Object -first 1
$RevA=$rev.ToString().Substring(5) -replace(".DXF") -replace('[a-z]') -replace('-') -replace 
's',''
$BOM=gci -path "$FolderPath" -Filter *.csv | Select-Object -first 1
Import-Csv -Path "$FolderPath$BOM" | ForEach-Object {
$_.PartName = "$($_.PartName -replace('[a-z]') -replace('-') -replace 's','')$RevA.DXF" 
$_.Thickness = "$($_.Thickness)" -replace("PL") 
$_ 
} | Export-Csv -Path "$FolderPathPrimeCutImport$RevA.csv" -NoTypeInformation
Add-Type -AssemblyName PresentationFramework
[windows.forms.messagebox]::show('Updated')

有没有一种方法可以列出目录中的所有.DXF,获取列中的所有条目(在这种情况下,列标题是"PartName"($_.PartName)(,然后将每个条目中的前4-5个字符与文件名中共享相同前4-5个字符的相应文件匹配?

对于每个匹配项,我希望列条目按照文件名命名。不知道这是否朝着正确的方向发展:

$filedirectory="C:Directoryetcfolder"
$tester=Import-csv $filedirectoryexample.csv
$listdxf=gci $filedirectory -filter *.DXF
foreach($file in $listdxf){
foreach($item in $tester){
# Not sure how to do this to only match the first 4 characters - trying to use the substring returns an error.
if($item.name.tostring.substring(0,4) -eq 
$file.basename.tostring.substring(0,4)){
rename-item $item.name -newname 
"$($file.basename).$($file.extension)" -Verbose
}
}
}

上面的代码使用.csv文件进行编辑,然后重命名文件,这与我想要的相反。新手太多了,不知道该怎么做,任何想法和反馈都将不胜感激。

Foreach-Object之后直接管道连接到Export-Csv的问题是,每次都会被新条目覆盖。您必须先执行操作,然后再导出。

在不考虑其他可能重复的名称的情况下,可以拆分PartName,获取连字符(-(之前的内容。然后,您就可以通过名称的第一部分匹配到文件名本身的下划线(_(。

$names = Get-ChildItem -Path $FolderPath -Filter '*.DXF' -Name
(
Import-Csv -Path "$filedirectoryexample.csv" | % {
$part = ($_.PartName -split ' -')[0]
$file_match = $names.Name | Where-Object -FilterScript { $_ -match "^${part}_" }
$_.PartName = if ($file_match) { $file_match } else { $_.PartName }
$_
}
) | Export-Csv -Path "$filedirectoryexample.csv" -NoTypeInformation

顾名思义,$names包含以*.DXF扩展名结尾的文件名。当您将PartName的当前迭代与文件名的开头进行比较时,匹配就是在这里发生的。

最新更新