PowerShell脚本开发:比对两文件匹配键与十进制数值
PowerShell脚本修正:两文件键值比对方案
文件说明
- File1:逗号分隔的CSV文件,包含两列,第一列为唯一字符键,第二列为十进制数值
- File2:CSV格式文件,顶部有多行无关内容,需跳过直到出现
Start of Data的行;后续内容为竖线分隔字段,需提取第1列的键和第4列的十进制数值
脚本需求
- 匹配两个文件中的键,仅处理同时存在于两个文件中的键
- 对比匹配键对应的十进制数值:
- 数值完全匹配时,记录为「匹配」
- 数值不匹配时,输出键、双方数值,可选附带File2的完整行
- 结果输出到指定CSV报告文件
修正后的PowerShell脚本
# 定义文件路径和输出路径 $file1Path = "C:\test\test1.csv" $file2Path = "C:\test\test2.csv" $outputPath = "C:\test\comparisonreport.csv" # 读取File1,构建键值哈希表(键为第一列,值为第二列的十进制数值) # 若File1列名固定(如Key/Value),可替换PSObject.Properties为具体列名 $file1Data = @{} Import-Csv -Path $file1Path -Delimiter ',' | ForEach-Object { $file1Data[$_.PSObject.Properties[0].Value] = [decimal]$_.PSObject.Properties[1].Value } # 读取File2,跳过无关行直到"Start of Data",处理竖线分隔内容 $file2Data = Get-Content -Path $file2Path | Select-Object -SkipUntil { $_ -eq "Start of Data" } | Select-Object -Skip 1 | ForEach-Object { $fields = $_.Split('|').Trim() if ($fields.Count -ge 4) { [PSCustomObject]@{ Key = $fields[0] Value = [decimal]$fields[3] FullLine = $_ # 保留完整行,不需要可删除 } } } # 对比数据生成结果 $comparisonResults = @() foreach ($entry in $file2Data) { if ($file1Data.ContainsKey($entry.Key)) { $file1Value = $file1Data[$entry.Key] $matchStatus = if ($file1Value -eq $entry.Value) { "匹配" } else { "不匹配" } $result = [PSCustomObject]@{ Key = $entry.Key File1_Value = $file1Value File2_Value = $entry.Value Match_Status = $matchStatus File2_FullLine= $entry.FullLine # 可选字段,不需要可删除 } $comparisonResults += $result } } # 导出结果到CSV $comparisonResults | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
脚本说明
File1处理:
- 用哈希表存储File1的键值对,实现O(1)级别的键查找效率
- 若File1列名固定(如
ID和Amount),可替换PSObject.Properties[0].Value为$_.ID、PSObject.Properties[1].Value为$_.Amount,提升代码可读性
File2处理:
- 通过
Select-Object -SkipUntil精准跳过无关内容,只处理Start of Data之后的有效行 - 分割竖线字段时自动去除前后空格,避免因格式问题导致的匹配错误
- 通过
对比逻辑:
- 只处理两个文件共有的键,过滤无匹配的条目
- 强制转换为
decimal类型进行数值对比,避免字符串比对的误差
输出设置:
- 使用
-NoTypeInformation避免CSV文件头部生成冗余类型信息 - 指定
UTF8编码保证中文环境下的兼容性
- 使用
内容的提问来源于stack exchange,提问作者letterp
相关产品推荐
相关产品推荐

