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

ilmyapht  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(144)

我有下一个CSV文件与数据一样,XML

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

字符串
我想用“”替换“”,用“”替换“”。我发现下一个 bat 文件与代码女巫的工作方式,删除所有引号和空格。但我现在不知道如何修改代码,以取代只有特定的报价。

@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请

cig3rfwq

cig3rfwq1#

你删除引号。好吧,这是朝着正确方向迈出的一步。
但是你必须保存双引号。
您可以通过 * 首先 * 将""替换为另一个字符(选择一个肯定不会出现在您的数据中的字符),* 然后 * 删除剩余的每个",* 最后 * 将该特殊字符(下面的§用于演示目的)恢复为""来完成此操作

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

字符串
(Note:这仍然会删除空行。有很多方法可以避免这种情况,但这不是你的问题,所以我把它排除在外)

3mpgtkmj

3mpgtkmj2#

处理批处理文件的 *Windows命令处理器 * cmd.exe不适用于处理CSV或XML文件,如PowerShell或VBScript。*Windows命令处理器 * 设计用于运行命令和可执行文件。甚至没有一个Windows command支持在文件中搜索字符串并将其替换为不同的字符串。因此,使用批处理文件将CSV文件重新格式化为部分XML文件是此任务的最差选择。
不过,可以使用以下命令行通过批处理文件完成任务:

@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命令的详细信息,以及每次执行这两个命令时在后台执行的操作,请参阅this answer
How to read and print contents of text file line by line?它详细解释了处理CSV文件中的空行所需的FOR命令行和set "Line=!Line:*:=!"
Batch scripts - cannot display the special character ^详细解释了为什么使用delims^=^ eol^=来避免FINDSTR从CSV文件输出中读取的任何一行,在将字符串分配给循环变量I之前,FOR会忽略或修改行号和冒号。在这种情况下,也可以只使用"tokens=*"(删除了前导正常空格和水平制表符的行)或"delims="(由于分隔符列表为空,因此没有行分割),因为FOR处理的每一行都以ASCII数字开头。
在删除行号和FINDSTR添加的冒号后,通过将当前行中出现的所有""替换为字符串#q-u-o-t-e#(预期不会出现在CSV文件中)来重新格式化行。接下来,从行中移除当前行中所有剩余的"。最后,在将该行附加到XML输出文件之前,所有出现的#q-u-o-t-e#都替换为"
另请阅读DosTips论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/
命令echo(是唯一可能输出空行或仅包含普通空格或水平制表符的空行的方法,它始终不像echo.echo/那样访问文件系统。
批处理文件通过将输入文件的文件扩展名替换为.xml来动态定义从输入文件名派生的输出文件名。因此,输入文件不能具有文件扩展名.xml,因为这将导致输入文件名与输出文件名相同。这将导致此代码在findstr.exe尝试打开输入文件之前将输入文件截断为0字节,这将失败,因为该文件已经被cmd.exe打开。如果输入文件名的文件扩展名为.xml,则可以添加一个IF条件,以将某些内容附加到输出文件名,并将其保留到文件扩展名.xml,如:

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


要了解所使用的命令及其工作方式,请打开command prompt窗口,在那里执行以下命令,并完整仔细地阅读每个命令的帮助页面。

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

相关问题