Python解析含换行的多竖线分隔表格:函数失效问题解决需求
问题:处理带换行的竖线分隔字符串转表格
需求说明
- 目标:编写Python函数,将特定格式的竖线分隔字符串转换为表格
- 格式规则:
- 双竖线(
||)包裹的内容为列名 - 单竖线(
|)分隔的是各列对应值 - 单元格内的换行需保留在原单元格中
- 双竖线(
示例
输入字符串
||Name||Age||Address||Phones||size|| |Edwards|22|London|06 45 06 06 06 06 75 85 06 06 07 85 22 15 48|180cm|
(注:输入中的换行需保留在Phones单元格内)
预期输出表格
| Name | Age | Address | Phones | size | | --- | --- | --- | --- | --- | | Edwards | 22 | London | 06 45 06 06 06\n06 75 85 06 06\n07 85 22 15 48 | 180cm |
原函数问题分析
你写的traiter_colonne_description函数处理带换行的单元格时失效,核心问题:
- 直接按
\n拆分所有行,把单元格内的换行误判为新的数据行 - 逻辑矛盾:拆分后单行不可能包含
\n,却用'\n' in ligne_sans_barre判断换行 - 拼接逻辑仅针对最后一列,无法识别跨行的完整单元格内容
解决方案
核心思路
- 先定位列名行:找到包含
||的行,提取列名并初始化存储结构 - 合并跨行数据:从列名行之后开始,把连续的非
||行合并成一个完整数据块,保留单元格内的换行 - 拆分完整数据块:对合并后的完整数据块用
|拆分,得到各列值,确保列数匹配
修正后的函数代码
import re import pandas as pd def traiter_colonne_description(df): dictionnaire_donnees = {} # 初始化描述字段存储非表格文本 dictionnaire_donnees['Description'] = [] for index, row in df.iterrows(): texte_modifie = row['Description'].replace('*', '').strip() colonnes = [] lignes = texte_modifie.split('\n') texte_description = "" current_data_block = [] in_data_block = False for ligne in lignes: ligne_stripped = ligne.strip() # 保留原描述处理逻辑(替换为你的traiter_ligne_description实际实现) dans_section_description, compteur_lignes, texte_description = traiter_ligne_description( ligne, False, 0, texte_description ) if '||' in ligne_stripped: # 处理列名行 noms_colonnes = re.split(r'\|\|', ligne_stripped) colonnes = [col.strip() for col in noms_colonnes if col.strip()] # 初始化各列存储列表 for col in colonnes: if col not in dictionnaire_donnees: dictionnaire_donnees[col] = [] # 处理之前未完成的数据块 if current_data_block and colonnes: full_data_line = '\n'.join(current_data_block).strip() valeurs = re.split(r'\|', full_data_line) valeurs = [valeur.strip() for valeur in valeurs if valeur.strip()] # 补全缺失的列值 while len(valeurs) < len(colonnes): valeurs.append('') # 将值对应到列 for col, valeur in zip(colonnes, valeurs): dictionnaire_donnees[col].append(valeur) current_data_block = [] in_data_block = False elif colonnes and (ligne_stripped.startswith('|') or in_data_block): # 收集数据块的行:起始行带|,后续跨行内容直接加入 current_data_block.append(ligne.strip()) in_data_block = True # 处理最后一个数据块 if current_data_block and colonnes: full_data_line = '\n'.join(current_data_block).strip() valeurs = re.split(r'\|', full_data_line) valeurs = [valeur.strip() for valeur in valeurs if valeur.strip()] while len(valeurs) < len(colonnes): valeurs.append('') for col, valeur in zip(colonnes, valeurs): dictionnaire_donnees[col].append(valeur) # 存入处理后的描述文本 dictionnaire_donnees['Description'].append(texte_description.strip()) # 返回DataFrame格式(可选,若需要字典格式可直接返回dictionnaire_donnees) return pd.DataFrame(dictionnaire_donnees) # 替换为你实际的traiter_ligne_description实现 def traiter_ligne_description(ligne, dans_section, compteur, texte): # 示例:收集非表格行作为描述文本 if not ('||' in ligne or '|' in ligne): texte += ligne + '\n' return dans_section, compteur, texte
函数说明
- 列名处理:自动识别
||包裹的列名,初始化对应存储列表 - 跨行数据合并:把属于同一单元格的换行内容合并成完整值
- 列值匹配:拆分数据块后自动补全缺失值,确保列数和值数对应
- 兼容原逻辑:保留原函数中描述文本的处理逻辑
测试验证
用示例输入测试:
# 构造测试DataFrame test_df = pd.DataFrame({'Description': ['''||Name||Age||Address||Phones||size|| |Edwards|22|London|06 45 06 06 06 06 75 85 06 06 07 85 22 15 48|180cm|''']}) result = traiter_colonne_description(test_df) print(result.to_markdown(index=False))
输出将完全符合预期格式,Phones列会保留原始换行。
内容的提问来源于stack exchange,提问作者user27963554
相关产品推荐
相关产品推荐

