编写PowerShell脚本验证CSV文件每行的两个字符串与数值
CSV文件ETL前置校验PowerShell脚本修复方案
需求说明
在将CSV文件发送至RPA工具执行ETL流程前,需完成以下校验:
- 忽略表头行,校验每一行数据
- 前两个字段为非空字符串(第二个字段可能包含逗号,需正确识别)
- 第三个字段为有效数值
- 任意行数据不满足要求或存在缺失时,判定校验失败,返回退出码2
示例数据
合格示例
ProductName,Description,Value "Product Number One","This is a description for product number 1, released 5/3/2024",3.4563 "A different Product Number","This is a description for product number 2, released 3/2/2025",5.3200 "This is another product","Another unique description, released 6/3/2022",5.0000
不合格示例
ProductName,Description,Value "Product Number One","This is a description for product number 1, released 5/3/2024", "A different Product Number",,5.3200 ""Another unique description, released 6/3/2022",5.0000
现有脚本问题分析
你提供的脚本仅检查文件中是否存在ProductName字符串,只要表头存在就直接返回退出码0,完全没有对数据行的内容进行校验,因此无论数据是否符合要求都会返回成功,无法满足需求。
修复后的脚本
$csvPath = 'c:\test\FileNameHere.csv' # 读取CSV文件,自动处理带逗号的引号包裹字段 $csvData = Import-Csv -Path $csvPath # 初始化校验通过标记 $validationPassed = $true # 遍历所有数据行(Import-Csv自动跳过表头,直接返回数据行) foreach ($row in $csvData) { # 计算当前行号(数据行从文件第2行开始,索引+2) $lineNumber = $csvData.IndexOf($row) + 2 # 校验ProductName字段非空 if ([string]::IsNullOrWhiteSpace($row.ProductName)) { Write-Host "错误:第$lineNumber行的ProductName字段为空" $validationPassed = $false } # 校验Description字段非空 if ([string]::IsNullOrWhiteSpace($row.Description)) { Write-Host "错误:第$lineNumber行的Description字段为空" $validationPassed = $false } # 校验Value字段为有效数值 $parsedValue = $null if (-not [double]::TryParse($row.Value, [ref]$parsedValue)) { Write-Host "错误:第$lineNumber行的Value字段不是有效数值,当前值:'$($row.Value)'" $validationPassed = $false } } # 根据校验结果返回对应退出码 if ($validationPassed) { Write-Host "CSV文件校验通过" exit 0 } else { Write-Host "CSV文件校验失败,请手动检查" exit 2 }
脚本逻辑说明
- 使用
Import-Csv读取文件:PowerShell的Import-Csv会自动识别CSV的格式,正确处理被引号包裹、包含逗号的字段,无需手动解析CSV结构,避免格式错误。 - 逐行校验字段:
- 用
[string]::IsNullOrWhiteSpace判断前两个字段是否为空或仅包含空白字符 - 用
[double]::TryParse验证第三个字段是否能转换为有效数值,支持整数、小数等格式
- 用
- 错误提示:输出具体错误的行号和问题,方便定位修复
- 返回退出码:校验通过返回0,失败返回2,符合RPA工具的调用要求
内容的提问来源于stack exchange,提问作者Todd
相关产品推荐
相关产品推荐

