You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配CSV列条目与目录DXF文件名并批量重命名CSV条目

解决方案

先上可直接运行的代码,核心逻辑是先建立DXF文件前缀到完整文件名的映射,再批量处理CSV内容:

$fileDirectory = "C:\Directory\etc\folder"

# 1. 收集所有DXF文件,提取前缀(比如从"23.54_0.DXF"获取"23.54"),建立映射哈希表
$dxfMap = @{}
Get-ChildItem -Path $fileDirectory -Filter *.DXF | ForEach-Object {
    # 按下划线分割文件名,取第一部分作为匹配前缀
    $prefix = $_.BaseName -split '_' | Select-Object -First 1
    # 把前缀和完整文件名存入哈希表(若有重复前缀,后续文件会覆盖前者,可按需调整)
    $dxfMap[$prefix] = $_.Name
}

# 2. 读取CSV并处理PartName列
$updatedCsv = Import-Csv -Path (Join-Path $fileDirectory "example.csv") | ForEach-Object {
    # 从PartName提取前缀:按"-"分割,取前面部分并去除前后空格
    $partPrefix = ($_.PartName -split '-')[0].Trim()
    # 检查哈希表是否有匹配前缀,有则替换PartName,无则保留原内容
    if ($dxfMap.ContainsKey($partPrefix)) {
        $_.PartName = $dxfMap[$partPrefix]
    }
    # 返回处理后的行对象
    $_
}

# 3. 导出修改后的CSV(建议用新文件名,避免覆盖原文件)
$updatedCsv | Export-Csv -Path (Join-Path $fileDirectory "Updated_example.csv") -NoTypeInformation

# 弹出完成提示
Add-Type -AssemblyName PresentationFramework
[Windows.MessageBox]::Show('CSV已更新完毕')

代码逻辑说明

  1. 建立DXF映射表:用哈希表存储DXF文件名的前缀和完整文件名,后续匹配时无需反复遍历文件列表,大幅提升效率。
  2. 提取CSV前缀:对CSV中每个PartName,按-分割后取第一部分并去除前后空格,得到用于匹配的核心标识(比如从23.54 - Gusset提取23.54)。
  3. 匹配替换:用提取的前缀去哈希表查找对应完整DXF文件名,找到则替换PartName,未找到则保留原内容(可按需添加提示或其他处理逻辑)。

你之前代码的问题

  1. 对象属性错误:$item.name应改为$item.PartName,因为Import-Csv导入的对象属性是CSV的列名(你的目标列是PartName)。
  2. 命令使用错误:Rename-Item是用来重命名系统文件的,而你的需求是修改CSV内的文本内容,完全用错了命令。
  3. 硬取固定长度的隐患:Substring(0,4)遇到长度不足4的字符串会直接报错,且部分前缀是5字符(比如25.01),硬取长度极易匹配错误。
  4. 双重循环效率低下:嵌套遍历DXF文件和CSV行,数据量大时运行缓慢,用哈希表做一次映射可彻底避免这个问题。

内容的提问来源于stack exchange,提问作者Jesse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:30:46