在一个文本文件中,我有以下几行:
2014-10-09 00:00:00.000;1663;2014-10-09 12:38:46.000;A;"
";0;0;E/272
2014-10-09 00:00:00.000;1663;2014-10-09 12:38:46.000;A;"
";0;0;D/275
我需要使用DOS批处理文件这个新输出:
2014-10-09 00:00:00.000;1663;2014-10-09 12:38:46.000;A;"";0;0;E/272
2014-10-09 00:00:00.000;1663;2014-10-09 12:38:46.000;A;"";0;0;D/275
我尝试过这个解决方案:
for /f "delims=" %%a in (oldfile.txt) do (
echo/|set /p ="%%a%"
)>>newfile.txt
但输出错误,我在txt newfile中没有两行但只有一行:
2014-10-09 00:00:00.000;1663;2014-10-09 12:38:46.000;A;"";0;0;E/2722014-10-09 00:00:00.000;1663;2014-10-09 12:38:46.000;A;"";0;0;D/275
我错过了什么?
此代码有什么问题?
提前谢谢。
答案 0 :(得分:1)
双引号值中的新行在CSV files中绝对有效。
为什么不使用支持Perl正则表达式的文本编辑器替换?
例如,运行Perl正则表达式替换使用搜索字符串(?<=")\s+(?=";)
并将空字符串替换为替换字符串将完成此任务。
为替换文件中的字符串而编写控制台应用程序。见
How can you find and replace text in a file using the Windows command-line environment?
但是,如果您因为某些未知原因想要使用批处理文件执行此操作,请查看下面的批处理代码,以便为您的示例工作。
@echo on
setlocal EnableDelayedExpansion
set "INTEXTFILE=oldfile.txt"
if not exist "%INTEXTFILE%" goto EndBatch
set "OUTTEXTFILE=newfile.txt"
if exist "%OUTTEXTFILE%" del "%OUTTEXTFILE%"
set "FirstLine="
set "EndFirstLine=""
set "BeginSecondLine= ";"
for /f "usebackq delims=" %%A in ("%INTEXTFILE%") do (
set "Line=%%A"
if not "!FirstLine!"=="" (
if "!Line:~0,22!"=="!BeginSecondLine!" (
set "FirstLine=!FirstLine!!Line:~20!"
echo !FirstLine!>>"%OUTTEXTFILE%"
set "Line="
) else (
echo !FirstLine!>>"%OUTTEXTFILE%"
)
set "FirstLine="
)
if not "!Line!"=="" (
if "!Line:~-1!"=="!EndFirstLine!" (
set "FirstLine=!Line!"
) else (
echo !Line!>>"%OUTTEXTFILE%"
)
)
)
:EndBatch
endlocal
此批处理文件也会删除空行。这是无法避免的,因为命令for
在解析文件时忽略空行。