匹配末尾含单个双引号的CSV行并删除的正则表达式需求
嗨,这个问题我之前处理过类似的,给你几个实用的方案,根据你的需求和技术栈选就行:
方案一:用Awk快速过滤(适合字段内无逗号的场景)
如果你的CSV字段内容里没有逗号,只需要确保每个字段都被双引号包裹,那用Awk一行命令就能搞定:
awk ' BEGIN { FS = "," } { valid = 1 for (i = 1; i <= NF; i++) { # 检查每个字段是否严格以"开头并以"结尾 if ($i !~ /^".*"$/) { valid = 0 break } } if (valid) print } ' your_input.csv > cleaned_output.csv
这个脚本会遍历每行的每个字段,只有当所有字段都符合"字段内容"格式时,才会保留该行。
方案二:用Python处理(支持字段内有逗号的复杂场景)
如果你的字段内容里可能包含逗号(比如"John, Doe","New York"这种合法行),Awk的简单分割会出错,这时候用Python的csv模块更可靠,它能正确解析带引号的字段:
import csv input_path = "your_input.csv" output_path = "cleaned_output.csv" with open(input_path, "r", encoding="utf-8") as infile, \ open(output_path, "w", encoding="utf-8", newline="") as outfile: # 配置writer,确保输出的行也保持每个字段用双引号包裹 writer = csv.writer(outfile, quoting=csv.QUOTE_ALL) for line_num, line in enumerate(infile, 1): stripped_line = line.strip() if not stripped_line: continue # 跳过空行 try: # 用csv.reader解析当前行,自动处理引号和字段内的逗号 reader = csv.reader([stripped_line], delimiter=",", quotechar='"') row = next(reader) # 额外验证:原行的引号结构必须合法 if not (stripped_line.startswith('"') and stripped_line.endswith('"')): continue if stripped_line.count('"') % 2 != 0: continue # 验证通过,写入输出文件 writer.writerow(row) except Exception as e: # 解析失败的行(比如引号不配对、格式混乱)直接跳过 print(f"Skipping invalid line {line_num}: {stripped_line}") continue
这个脚本不仅能过滤掉格式错误的行,还能正确处理字段内包含逗号的合法行,同时保留原始的正确格式。
注意事项
- 如果你的CSV存在转义引号(比如
"He said \"Hello\""),需要在Python的csv.reader中启用escapechar='\\'参数。 - 处理大文件时,Awk的性能会比Python好一些,但Python的灵活性更强。
内容的提问来源于stack exchange,提问作者mas
相关产品推荐
相关产品推荐

