当前位置: 首页 > 知识库问答 >
问题:

Powershell正则表达式替换未替换的双引号,然后换行

钦宏义
2023-03-14

我正在处理一个大的csv文件,其中的字段用双引号括起来,其中的文本描述包含未替换的双引号,我需要用转义的双引号替换。我尝试过使用以下正则表达式:(?

我知道csv格式不正确,但不幸的是,我无法控制它,所以我需要能够纠正格式以进行进一步处理。

例子:

"Field 1","Field 2","Field 3 "with unescaped quote"
followed by line break","Field 4"

需要成为:

"Field 1","Field 2","Field 3 ""with unescaped quote""
followed by line break","Field 4"

我使用的Powershell脚本如下:

    [string]$path = 'C:\ ...'
    [string]$directory = [System.IO.Path]::GetDirectoryName($Path);
    [string]$strippedFileName = [System.IO.Path]::GetFileNameWithoutExtension($Path);
    [string]$extension = [System.IO.Path]::GetExtension($Path);
    [string]$newFileName = $strippedFileName + [DateTime]::Now.ToString("yyyyMMdd-HHmmss") + $extension;
    [string]$newFilePath = [System.IO.Path]::Combine($directory, $newFileName);

    $reader = New-Object 'System.IO.StreamReader'($path, $true);
    $regex = [regex] '(?<!^|",)("(?:$[^"])|"(?!,"|$))'
    $writer = [System.IO.StreamWriter] $newFilePath;  

    try{
        while (($line = $reader.ReadLine()) -ne $null ){
            $newline = $line -replace $regex, '""';
            $writer.WriteLine($newline);            
        }
    }
    finally{
        $reader.Close();
        $writer.Close();
    }

共有1个答案

漆雕和雅
2023-03-14

下一次,尝试建立一个最小的、可重复的例子(也为你自己),因为这可能有助于更好地理解问题
这方面的一个常见缺陷是,标准cmdletGet Content读取一系列行(string[]),其中每行本身不包含任何换行符,但在输出到显示器或文件时,换行符用作默认分隔符(数组中的每个项目之间)。您可以通过使用-Raw参数来解决这个问题,但这会将所有内容读入内存,并可能使其比实际情况更加复杂
我怀疑您实际上想要查找不以双引号开头的行,这意味着前面的csv行可能被截断。也就是说,在这种情况下,您需要用额外的双引号连接前一行,重新插入换行符并添加当前行:

Get-Content .\Input.csv | Foreach-Object { $Previous = $Null } {
    if ($_.StartsWith('"')) { 
        $Previous
        $Previous = $_
    } else {
        $Previous += '"' + [Environment]::NewLine + $_
    }
} { $Previous } | Set-Content .\Output.csv
 类似资料:
  • 我有一个应用程序收到一个格式错误的JSON字符串,如下所示: null 也可能是格式错误的JSON字符串: 在本例中,不应替换消息值中的单引号。

  • 下面就来详细介绍Notepad++中关于正则表达式的部分,主要是查找和替换。 对于替换功能,一般的文本编辑器,都具有此功能,但是对于高级的正则表达式替换,则很多都不支持。而此处Notepad++支持此功能。 正则表达式的替换,在很长一段时间内,我都没有用到过。而后来有此需求的时候,由于不熟悉,导致也没去折腾具体如何使用的。 后来有空去弄了下,终于搞懂了。对此类功能不了解的人,会没啥感觉,但是看了下

  • 问题内容: 我有这个字符串: 现在,我想在每个数字之前添加String num:。 因此结果必须是: 这也必须工作: 用于搜索数字的正则表达式是:[0-9]+ 但是我想用num:+ [匹配的子字符串]替换匹配的子字符串。 我现在写了一个带有数字的示例,但另一个示例可以是:在每个电子邮件地址之前添加 ·Email found·: 问题答案: 利用分组。您可以使用括号(并)定义组,并通过组索引$n在哪

  • 如何替换文本文件中两个引号之间的所有输入。第一个引号总是前面有一个选项卡,或者它是行中的第一个字符(csv文件)。我尝试了以下正则表达式 但是这个正则表达式只匹配两个引号之间的第一个输入,而不是全部。 例如,以下文本: 应成为 我读了下面的文章(javascript正则表达式替换括号之间的空格),非常相似,但正则表达式建议在我的情况下不可用。

  • 我需要替换以下字符串中的引号。 最终输出应该是“这是test()ing和test()ing”; i、 e仅当它以“test()开头,以”结尾时才替换。中间的文本保持不变。 这个坏了。 请为同样的问题推荐合适的正则表达式。

  • 问题内容: 我需要替换字符串的一部分。我浏览了Python文档并发现了re.sub。 我期望这能打印,而不是“酒吧”。 谁能告诉我我做错了什么? 问题答案: 除了捕获要 替换 的零件外,您还可以捕获要 保留 的零件,然后使用引用对其进行引用以将它们包括在替换字符串中。 尝试以下方法: 另外,假设这是HTML,则应考虑使用HTML解析器来执行此任务,例如Beautiful Soup 。