开发者社区 问答 正文

CSV尺寸不同的生产线

我正在尝试将PDF银行摘录转换为csv。我是python的新手,但是我设法从pdf中提取文本。我以类似以下内容结束:

AMAZON 23/12/2019 15:40 -R $ 100,00 R $ 400,00信用 某些餐厅23/12/2019 14:00 -R $ 10,00 R $ 500信用 从John Doe收到22/12/2019 15:00 R $ 510 R $ 500,00 03游戏22/12/2019 15:00 R $ 10 R $ 10,00借记卡

我想要这个输出: AMAZON; 23/12/2019; -100,00 Some Restaurant; 23/12/2019; -10,00 从John Doe收到; 22/12/2019; 510 03游戏; 22/12/2019; 10

第一个字段的大小不同,我不需要时间和货币格式。我不需要最后2个字段。

到目前为止,我有以下代码(仅从PDF中提取文本):

import pdfplumber
import sys

url = sys.argv[1]
pdf = pdfplumber.open(url)
pdf_pages = len(pdf.pages)

for i in range(pdf_pages):
    page = pdf.pages[(i)]
    text = page.extract_text()
    print(text)
pdf.close()

谁能给我一些指示?

展开
收起
几许相思几点泪 2019-12-24 21:15:18 753 分享 版权
阿里云 AI 助理回答

要将提取的PDF文本转换为所需的CSV格式,您需要进行几个处理步骤:解析文本、清洗数据、重组结构并最终写入CSV文件。以下是一个基于您提供的代码和需求的示例Python脚本:

import pdfplumber
import csv
import sys
import re

def clean_amount(amount_str):
    """清理并标准化金额字符串"""
    amount = re.sub(r'[^\d,]', '', amount_str)  # 移除非数字和逗号
    return amount.replace(',', '.')  # 将逗号替换为小数点以符合标准数值格式

def process_text(text):
    """从原始文本中提取所需信息并重组为列表"""
    lines = text.split('\n')
    data_rows = []
    for line in lines:
        parts = line.split(' -')
        if len(parts) == 2:  # 确保行包含交易信息
            description, details = parts
            date, time, _, amount_with_sign, _ = details.split()
            amount = clean_amount(amount_with_sign)
            # 注意:根据正负号调整金额
            amount = float(amount) * (-1 if amount_with_sign.startswith('-') else 1)
            # 重组为期望的结构
            data_rows.append([description.strip(), date, f"{amount:.2f}"])
    return data_rows

url = sys.argv[1]
pdf = pdfplumber.open(url)
pdf_pages = len(pdf.pages)

all_data = []

for i in range(pdf_pages):
    page = pdf.pages[i]
    text = page.extract_text()
    cleaned_data = process_text(text)
    all_data.extend(cleaned_data)

pdf.close()

# 写入CSV文件
csv_file_path = 'bank_transactions.csv'
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=';')
    csvwriter.writerow(['Description', 'Date', 'Amount'])  # CSV头
    csvwriter.writerows(all_data)

print(f"数据已成功转换并保存至 {csv_file_path}")

这个脚本首先定义了两个辅助函数:clean_amount用于清理并标准化金额值,而process_text则负责从每行文本中提取描述、日期和金额,并重组为一个列表。之后,脚本遍历PDF中的所有页面,提取文本并使用process_text处理每一页面的数据,最后将所有数据写入到CSV文件中。

请注意,由于您的银行摘录的具体格式可能与示例有所不同,您可能需要微调正则表达式或数据处理逻辑以适应实际的文本结构。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: