PowerShell实现PDF提取文本转标准CSV格式技术求助
解决PDF账单转CSV的PowerShell行合并问题
问题背景
银行账单仅支持PDF导出,财务软件需要CSV格式数据,出于安全考虑不使用云转换服务,通过PowerShell处理从PDF复制提取的文本:
- 已过滤无关行,得到垂直格式文本,示例如下:
Date, Description, Money out, Money in, Borrowings, 01 Feb 2024, CDN Bank 1, 1601.87, 3490.43 CR, ...
- 期望转换为标准CSV格式(每行以日期开头):
"Date","Description","Money out","Money in","Borrowings" "01 Feb 2024","CDN Bank 1","1601.87","3490.43 CR" ...
- 现有合并行代码报错:
Exception calling "Substring" with "2" argument(s): "Index and length must refer to a location within the string.",且输出不符合预期,错误输出示例:
Description,Money out,Money in,Borrowings,01 Feb 2024,CDN Bank 1,1601.87,3490.43 CR,01 Feb 2024,Life Ins,372.23,3118.20 CR,...
错误原因
- Substring越界错误:代码中用
$fields[0].Substring(0,5)判断日期,但表头行(如Date,)的字段长度不足5,执行Substring时触发索引越界。 - 合并逻辑错误:日期判断逻辑不准确,且未区分表头和数据行,导致表头被混入数据行,最终输出所有内容连成一串。
解决方案
步骤1:优化过滤代码
先确保过滤后的文本保留正确的表头和数据行,去掉多余逗号:
$inputFile = "C:\Users\J\Downloads\input\VerticalFile.txt" $outputFile = "C:\Users\J\Downloads\Output\FilteredFile.txt" # 读取文件并处理:移除行首行尾的逗号,过滤指定关键词行 $lines = Get-Content $inputFile | ForEach-Object { # 移除字符串两端的逗号和空白字符 $trimmed = $_.Trim().Trim(',') # 仅保留非空且不匹配过滤关键词的行 if ($trimmed -and $trimmed -notmatch 'James|CDNBnk|number|continued') { $trimmed } } # 写入过滤后的文件 $lines | Set-Content -Path $outputFile Write-Host "过滤完成,输出文件:$outputFile"
步骤2:正确合并行并生成CSV
基于过滤后的文件,按每5行一组(表头+每组数据各5项)合并为CSV行:
$filteredFile = "C:\Users\J\Downloads\Output\FilteredFile.txt" $csvOutputFile = "C:\Users\J\Downloads\Output\FinalBill.csv" # 读取过滤后的所有行 $allLines = Get-Content $filteredFile # 提取表头(前5行)并格式化为带引号的CSV表头 $header = $allLines[0..4] | ForEach-Object { "`"$_`"" } -join ',' # 处理数据行:从第6行开始,每5行组成一条CSV记录 $dataRows = for ($i = 5; $i -lt $allLines.Count; $i += 5) { # 取当前组的5行(如果剩余不足5行则取全部) $group = $allLines[$i..($i+4)] | Where-Object { $_ } # 格式化为带引号的字段并拼接成一行 $group | ForEach-Object { "`"$_`"" } -join ',' } # 合并表头和数据行,写入CSV文件 @($header) + $dataRows | Set-Content -Path $csvOutputFile -Encoding UTF8 Write-Host "CSV生成完成,输出文件:$csvOutputFile"
代码说明
- 过滤代码:移除多余逗号和空白,仅保留有效行,避免后续合并时出现空字段。
- 合并代码:
- 直接提取前5行作为表头,避免判断逻辑出错。
- 从第6行开始按每5行一组拆分,对应CSV的每一条记录。
- 给每个字段添加双引号,符合标准CSV格式要求。
内容的提问来源于stack exchange,提问作者Jimf2
相关产品推荐
相关产品推荐

