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

PowerShell实现PDF提取文本转标准CSV格式技术求助

解决PDF账单转CSV的PowerShell行合并问题

问题背景

银行账单仅支持PDF导出,财务软件需要CSV格式数据,出于安全考虑不使用云转换服务,通过PowerShell处理从PDF复制提取的文本:

  1. 已过滤无关行,得到垂直格式文本,示例如下:
Date,
Description,
Money out,
Money in,
Borrowings,
01 Feb 2024,
CDN Bank 1,
1601.87,
3490.43 CR,
...
  1. 期望转换为标准CSV格式(每行以日期开头):
"Date","Description","Money out","Money in","Borrowings"
"01 Feb 2024","CDN Bank 1","1601.87","3490.43 CR"
...
  1. 现有合并行代码报错: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,...

错误原因

  1. Substring越界错误:代码中用$fields[0].Substring(0,5)判断日期,但表头行(如Date,)的字段长度不足5,执行Substring时触发索引越界。
  2. 合并逻辑错误:日期判断逻辑不准确,且未区分表头和数据行,导致表头被混入数据行,最终输出所有内容连成一串。

解决方案

步骤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"

代码说明

  1. 过滤代码:移除多余逗号和空白,仅保留有效行,避免后续合并时出现空字段。
  2. 合并代码:
    • 直接提取前5行作为表头,避免判断逻辑出错。
    • 从第6行开始按每5行一组拆分,对应CSV的每一条记录。
    • 给每个字段添加双引号,符合标准CSV格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:57:06