我有下一个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请
2条答案
按热度按时间cig3rfwq1#
你删除引号。好吧,这是朝着正确方向迈出的一步。
但是你必须保存双引号。
您可以通过 * 首先 * 将
""
替换为另一个字符(选择一个肯定不会出现在您的数据中的字符),* 然后 * 删除剩余的每个"
,* 最后 * 将该特殊字符(下面的§
用于演示目的)恢复为""
来完成此操作字符串
(Note:这仍然会删除空行。有很多方法可以避免这种情况,但这不是你的问题,所以我把它排除在外)
3mpgtkmj2#
处理批处理文件的 *Windows命令处理器 *
cmd.exe
不适用于处理CSV或XML文件,如PowerShell或VBScript。*Windows命令处理器 * 设计用于运行命令和可执行文件。甚至没有一个Windows command支持在文件中搜索字符串并将其替换为不同的字符串。因此,使用批处理文件将CSV文件重新格式化为部分XML文件是此任务的最差选择。不过,可以使用以下命令行通过批处理文件完成任务:
字符串
此批处理文件处理任何“ANSI”(每个字符一个字节)或UTF-8编码的CSV文件,包括空行和包含一个或多个感叹号的行。不支持UTF-16编码的CSV文件,因为FINDSTR不支持在UTF-16编码的文件中搜索。
与纯PowerShell或VBScript解决方案相比,纯批处理文件解决方案非常慢,因为要为每行设置启用延迟变量扩展的本地执行环境,并在重新格式化该行并将其追加到XML输出文件后丢弃该环境。有关SETLOCAL和ENDLOCAL命令的详细信息,以及每次执行这两个命令时在后台执行的操作,请参阅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
,如:型
要了解所使用的命令及其工作方式,请打开command prompt窗口,在那里执行以下命令,并完整仔细地阅读每个命令的帮助页面。
echo /?
endlocal /?
findstr /?
for /?
if /?
set /?
setlocal /?