使用 bat 文件从 csv 文件中删除特定引号

Remove specific quotes from csv file using bat file

提问人:pape 提问时间:7/27/2023 最后编辑:pape 更新时间:8/13/2023 访问量:54

问:

我有下一个csv文件,其中包含像xml这样的数据

  "<Person>
      <Name> ""Test"" </Name> <Surname>""Test1""</Surname>
   </Person>
   <Person>
     <Name>""TestA""</Name>  <Surname>""""</Surname>
   </Person>"

我想将“”“替换为”“,并将”“替换为”。 我发现下一个带有代码的蝙蝠文件女巫的工作方式是删除所有引号和空格。但我现在不知道如何修改代码以仅替换特定的引号。

  @echo off
  setlocal EnableDelayedExpansion

  set FileIn=C:\Users\PC\Documents\test.csv
  set FileOut=C:\Users\PC\Documents\TestNew.csv

    (
      For /F "usebackq tokens=*" %%A in ("%FileIn%") do (
      set Line = %%A
      set Line=!Line:"=!
      Echo.!Line!
    )
    )
  > "%FileOut%"

谁能帮我解决这个问题? 要像这样获取 csv:

  <Person>
   <Name> "Test" </Name> <Surname>"Test1"</Surname>
  </Person>
  <Person>
   <Name>"TestA"</Name> <Surname>""</Surname>
  </Person>

现在我有批量限制字符的问题,有人可以用powershell给我发布示例吗

XML CSV 批处理文件 报价

评论

0赞 pape 7/27/2023
是的,但我将这个文件转换为xml,所以这很好
0赞 Zach Young 7/27/2023
回到@Mofi所说的,如果你有一个包含XML数据的CSV文件,你可能希望使用CSV读取器/解析器读取该数据,并将结果作为XML写入.xml文件。假装 CSV 只是 XML,其中包含一些可以删除的错误字符,可能会导致最终 XML 出现问题。也许如果您使用 PowerShell 标记询问,具有 PS 经验的人可以提出解决方案。

答:

1赞 Stephan 7/27/2023 #1

删除引号。好的,这是朝着正确方向迈出的一步。
但是您必须保存双引号。

为此,您可以用另一个字符替换(选择一个绝对不会出现在您的数据中的字符),然后删除每个剩余的字符,最后将该特殊字符(下面用于演示目的)恢复为"""§""

For /F "usebackq tokens=*" %%A in ("%FileIn%") do (
  set "Line=%%A"
  set "Line=!Line:""=§!"
  set "Line=!Line:"=!"
  set "Line=!Line:§="!"
  Echo.!Line!
)

(注意:这仍将删除空行。有一些方法可以避免这种情况,但这不是你的问题,所以我把它省略了)

评论

0赞 pape 7/27/2023
我想停止删除空行......你可以帮我吗。。。
0赞 pape 7/27/2023
它奏效了,谢谢
0赞 pape 7/27/2023
你能帮我请取消空行吗......
0赞 Stephan 7/27/2023
例如这个
0赞 Mofi 7/27/2023 #2

处理批处理文件的 Windows 命令处理器不是为处理 CSV 或 XML 文件(如 PowerShell 或 VBScript)而设计的。Windows 命令处理器专为运行命令和可执行文件而设计。甚至没有 Windows 命令支持在文件中搜索字符串并将其替换为其他字符串。因此,对于此任务,使用批处理文件将 CSV 文件重新格式化为部分 XML 文件是最糟糕的选择。cmd.exe

但是,可以使用以下命令行通过批处理文件完成该任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FileIn=C:\Users\PC\Documents\test.csv"
if not exist "%FileIn%" echo ERROR: Missing file: "%FileIn%"& exit /B 1
for %%I in ("%FileIn%") do set "FileOut=%%~dpnI.xml"

(for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /N "^" "%FileIn%"') do (
    set "Line=%%I"
    setlocal EnableDelayedExpansion
    set "Line=!Line:*:=!"
    if defined Line (
        set "Line=!Line:""=#q-u-o-t-e#!"
        set "Line=!Line:"=!"
        echo(!Line:#q-u-o-t-e#="!
    ) else echo(
    endlocal
))>"%FileOut%"
endlocal

此批处理文件可更正任何“ANSI”(每个字符一个字节)或 UTF-8 编码的 CSV 文件,包括空行和包含一个或多个感叹号的行。它不支持 UTF-16 编码的 CSV 文件,因为 FINDSTR 不支持在 UTF-16 编码文件中搜索。

与纯 PowerShell 或 VBScript 解决方案相比,纯批处理文件解决方案的速度非常慢,因为为每一行设置了一个启用延迟变量扩展的本地执行环境,并在重新格式化行并将其追加到 XML 输出文件后丢弃该环境。阅读此答案,了解有关命令 SETLOCALENDLOCAL 的详细信息,以及每次执行这两个命令时在后台执行的操作。

另请阅读: 如何逐行读取和打印文本文件的内容?它详细解释了 FOR 命令行,并且还需要处理 CSV 文件中的空行。set "Line=!Line:*:=!"

批处理脚本 - 无法显示特殊字符 ^ 详细解释了为什么用于避免在将字符串分配给循环变量之前,FOR 忽略或修改 FINDSTR 输出的行,开头有行号和冒号。在这种情况下,也可以只使用(删除了前导普通空格和水平制表符的行)或(由于分隔符列表为空,因此没有行拆分),因为 FOR 要处理的每一行都以 ASCII 数字开头。delims^=^ eol^=I"tokens=*""delims="

删除行号和 FINDSTR 添加的冒号后,行的重新格式化是通过将当前行中出现的所有字符串替换为 CSV 文件中预计不存在的字符串来完成的。接下来,从该行中删除当前行中剩余的所有内容。最后,将所有出现的 替换为 在将该行追加到 XML 输出文件之前。""#q-u-o-t-e#"#q-u-o-t-e#"

另请阅读 DosTips 论坛主题:ECHO。无法给出文本或空行 - 改用 ECHO/
该命令是唯一可能输出空行或仅包含普通空格或水平制表符的空行,这些空行始终不访问文件系统。
echo(echo.echo/

批处理文件通过将输入文件的文件扩展名替换为 来动态定义从输入文件名派生的输出文件名。由于这个原因,输入文件不能具有文件扩展名,因为这将导致输入文件名与输出文件名相同。这将导致此代码在尝试打开输入文件之前将输入文件截断为 0 字节,这将失败,因为该文件已被 打开。如果输入文件名的文件扩展名如下,则可能会添加一个 IF 条件来将某些内容附加到输出文件名中,以便保留到文件扩展名:.xml.xmlfindstr.execmd.exe.xml.xml

for %%I in ("%FileIn%") do if /I not  "%%~xI" == ".xml" (set "FileOut=%%~dpnI.xml") else set "FileOut=%%~dpnI_out.xml"

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并完整、仔细地阅读每个命令的显示帮助页面。

  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • if /?
  • set /?
  • setlocal /?