PowerShell中移除非指定开头行换行符的正则失效问题
修复CSV中的错误换行(PowerShell实现)
问题说明
我有一个大型CSV文件,部分行存在错误换行,导入Excel后需要手动修正数百行。Notepad++里能用正则表达式移除非以;开头行的换行符,但这个逻辑在PowerShell脚本里跑不通。
输入示例
;BP;7165378;XX_RAW;200SSS952;EU-PL;PL02;PL02;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 15:00:00;;;;Jhon Name;;;;;;;;9444253;;;;;;;;;;;;;"Jhon Name";;;;;;;;;;;Jhon Name;;;;;;;;Final Check Approved;;;;;;;;;09.01.2023;;;;;Approve;;;;;;12077;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
预期结果
;BP;7165378;XX_RAW;200SSS952;EU-PL;PL02;PL02;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15:00:00;;;;Jhon Name;;;;;;;;9444253;;;;;;;;;;;;;"Jhon Name";;;;;;;;;;;Jhon Name;;;;;;;;Final Check Approved;;;;;;;;;09.01.2023;;;;;Approve;;;;;;12077;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
当前代码问题
原来的代码有两个关键错误:
$content = Get-Content -path "C:\Users\TUF17\Desktop\File\Fix\xx_fix_temp.csv" $content -Replace '"\R(?!;)"', ' ' | Out-File "C:\Users\TUF17\Desktop\File\Fix\xx_noenters.csv"
- 未读取完整文件内容:
Get-Content默认按行拆分字符串数组,换行符被剥离,根本没法匹配跨行的换行场景。 - 正则表达式错误:多了不必要的引号,逻辑也不对——我们要匹配的是「换行符后不跟
;」的情况,不是带引号的换行。
修正后的代码
# 用-Raw参数读取整个文件,保留所有换行符 $content = Get-Content -Path "C:\Users\TUF17\Desktop\File\Fix\xx_fix_temp.csv" -Raw # 匹配所有换行符,且换行后不是以;开头的,将换行替换为空(如果需要空格分隔,把''改成' '即可) $fixedContent = $content -replace '\R(?!;)', '' # 输出到新文件,指定UTF-8编码避免乱码 $fixedContent | Out-File -Path "C:\Users\TUF17\Desktop\File\Fix\xx_noenters.csv" -Encoding UTF8
逻辑说明
-Raw参数:让PowerShell读取整个文件为单个字符串,保留原始的换行符(\r\n或\n),这样正则才能跨行匹配。- 正则
\R(?!;):\R匹配任意换行符序列,(?!;)是负前瞻断言,确保换行符后面的字符不是;,符合「非以;开头的行需要合并到上一行」的需求。
内容的提问来源于stack exchange,提问作者majan
相关产品推荐
相关产品推荐

