如何在"),"处拆分长字符串?MySQL导出文本解析问题
解决MySQL导出文本的拆分难题
嘿,我太懂这种卡在文本拆分上的烦躁了——尤其是处理数据库导出的这种格式化批量数据,稍不留神就踩坑。针对你手里这种(92,'xxxname',4013),(93,'sss-xxx',4047)...格式的文本,我给你几个亲测好用的解决方案:
方案1:用正则表达式精准捕获每条记录
直接按逗号拆分绝对会翻车(比如字符串里如果藏着逗号,或者转义的单引号),用正则匹配完整的记录才是稳妥的路子。以Python为例,你可以用这个正则来匹配每条括号包裹的记录:
import re # 读取原始文件内容 with open('input.txt', 'r') as f: content = f.read() # 匹配所有 (数字,'字符串',数字) 格式的记录,兼容转义单引号 pattern = r'\(\d+,\s*\'[^\']*(?:\\\'[^\']*)*\',\s*\d+\)' records = re.findall(pattern, content) # 处理每条记录,生成新内容(这里可以根据需求修改字段) new_content = '\n'.join(records) with open('output.txt', 'w') as f: f.write(new_content)
这个正则会自动忽略字符串内部的转义单引号(比如'xxx\'name'),确保每条记录都被完整捕获,不会被误拆分。
方案2:利用MySQL工具简化处理
如果你的最终目的是修改后重新插入MySQL,其实没必要自己写全量解析逻辑——直接用MySQL自带的工具更高效:
- 先把原始文本补成完整的INSERT语句(比如开头加
INSERT INTO your_table VALUES),然后用sed命令批量修改字段:# 示例:把所有记录里的第三个数字字段加1000 sed -E 's/(\([0-9]+,\s*'\''[^'\']+'\'',\s*)([0-9]+)\)/\1\(\2+1000\)/g' input.sql > output.sql - 或者用
LOAD DATA INFILE,先把文本预处理成CSV格式(把),(替换成换行,去掉首尾的(和)),然后直接导入时指定字段映射和修改规则。
方案3:转成CSV格式结构化解析
如果需要更灵活的字段级修改,可以先把原始格式转成标准CSV,再用CSV库处理:
with open('input.txt', 'r') as f: content = f.read().strip('()') # 去掉首尾的括号 csv_content = content.replace('),(', '\n') # 把记录分隔符换成换行 # 用csv模块读取,自动处理字符串里的特殊字符 import csv with open('output.csv', 'w') as f: writer = csv.writer(f) for line in csv_content.split('\n'): # 拆分字段并去除单引号和多余空格 fields = [field.strip().strip("'") for field in line.split(',')] # 这里可以对字段做修改,比如fields[2] = str(int(fields[2]) + 1000) writer.writerow(fields)
转成CSV后,你就可以轻松修改任意字段,再根据需求转成目标格式。
内容的提问来源于stack exchange,提问作者Ed Taylor
相关产品推荐
相关产品推荐

