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

PySpark读取含双引号内分隔符的文本文件解决方案咨询

解决方案

你的问题核心在于PySpark默认CSV读取器的quote参数是用来包裹单个字段的完整内容,但你的原始数据中引号跨了多个字段(role、exp、task_desc),导致默认解析逻辑无法正确拆分字段。以下两种方法可以解决这个问题:

方法一:RDD手动行处理

先按行读取文本,再手动拆分字段,精准处理引号内的分隔符:

# 1. 读取文本文件,指定编码ISO-8859-1
text_rdd = spark.sparkContext.textFile("test.txt", use_unicode=False).map(lambda x: x.decode('ISO-8859-1'))

# 2. 提取表头和数据行
header = text_rdd.first().split('þ')
data_rdd = text_rdd.filter(lambda line: line != text_rdd.first())

# 3. 定义行处理函数
def parse_line(line):
    start_quote = line.find('"')
    end_quote = line.rfind('"')
    
    # 拆分引号外、引号内、引号后的部分
    left_section = [p.strip() for p in line[:start_quote].split('þ') if p.strip()]
    quote_content = line[start_quote+1:end_quote].split('þ')
    right_section = [p.strip() for p in line[end_quote+1:].split('þ') if p.strip()]
    
    # 拼接成目标字段格式
    return (
        left_section[0],
        left_section[1],
        f'"{quote_content[0].strip()}',
        quote_content[1].strip(),
        f'{quote_content[2].strip()}"',
        right_section[0]
    )

# 4. 转换为DataFrame
from pyspark.sql import Row
result_df = data_rdd.map(parse_line).map(lambda x: Row(
    id=x[0], name=x[1], role=x[2], exp=x[3], task_desc=x[4], comp=x[5]
)).toDF()

# 查看结果
result_df.show(truncate=False)

方法二:正则表达式提取字段

利用Spark的正则表达式函数直接匹配并提取每个字段,代码更简洁:

from pyspark.sql import functions as F

# 1. 读取文本文件
df = spark.read.text("test.txt", encoding='ISO-8859-1')

# 2. 提取表头并过滤表头行
header_str = df.first()[0]
df = df.filter(df.value != header_str)

# 3. 用正则表达式提取每个字段
result_df = df \
    .withColumn("id", F.regexp_extract("value", r'^(\d+)þ', 1)) \
    .withColumn("name", F.regexp_extract("value", r'þ([^þ]+)þ"', 1)) \
    .withColumn("role", F.concat(F.lit('"'), F.regexp_extract("value", r'þ"([^þ]+)þ', 1))) \
    .withColumn("exp", F.regexp_extract("value", r'þ\s*(\d+)þ', 1)) \
    .withColumn("task_desc", F.concat(F.regexp_extract("value", r'þ\s*([^"]+)"', 1), F.lit('"'))) \
    .withColumn("comp", F.regexp_extract("value", r'"þ\s*(\w+)$', 1)) \
    .drop("value")

# 查看结果
result_df.show(truncate=False)

两种方法都能输出你期望的DataFrame结构,处理引号内包含分隔符的特殊场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:34:53