我正在Windows中编写一个脚本,一个.BAT文件,以替换:
请注意,有一个ENTER,我的意思是字符串分为两行。现在看起来更复杂:在2个双引号之后有2个空格,然后是“ENTER”
""
"2014
所以,像:(双引号)(双引号)(空格)(空格)(换行)(双引号)2014
我遇到了这个问题。这就是脚本的样子:
@echo off
setlocal enabledelayedexpansion
set INTEXTFILE=FILE_IN_CSV.csv
set OUTTEXTFILE=222.csv
set SEARCHTEXT=^"^"^"2014
set REPLACETEXT=^"^"^"4
set OUTPUTLINE=
for /f "tokens=1,* delims=¶" %%A in ( '"type %INTEXTFILE%"') do (
SET string=%%A
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
echo !modified! >> %OUTTEXTFILE%
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
有什么想法吗?
谢谢!
编辑:添加源文本示例。看到每行末尾有3个(不是2!)黑色空格。
"2014091810000076";"Question about folder sizes";"2014-09-18 12:10:20";"2014-09-25 17:33:15";"Resolt Sistemes";"jbgsfnam";"Sistemes::Altres";"STFD";"peticions";""
"2014091910000109";"Error opening word files with office 2013";"2014-09-19 09:50:07";"2014-09-25 14:27:59";"Resolt TRO";"yerttom";"Qualitat::Altres";"STFD";"peticions";""
我只需要删除每行开头的20,而不是行中间的其他20个。
答案 0 :(得分:0)
你的方法无法正常工作。
命令for
始终逐行处理文本。因此,不可能将2行作为字符串添加到环境变量中并修改此字符串。
段落符号¶
(代码值B6十六进制)在查看显示行结尾的文本文件时只是一个占位符。 CSV文件包含回车符(0D)和换行符(0A),命令for
始终将其解释为与您指定的内容无关的分隔符。
最好使用UltraEdit或Notepad ++或Sublime Text等文本编辑器在文件中进行替换。甚至不需要在那些编辑器中运行正则表达式替换。但是使用Perl正则表达式""\s+"2014
作为搜索字符串并替换字符串"""4
将导致您想要的修改。
还有为替换文件中的字符串而编写的控制台应用程序。看看How can you find and replace text in a file using the Windows command-line environment?
使用以下代码,仍然可以使用标准命令搜索"" \r\n"2014
并用文件中的"""4
替换它。
@echo off
setlocal EnableDelayedExpansion
set "INTEXTFILE=FILE_IN_CSV.csv"
if not exist "%INTEXTFILE%" goto EndBatch
set "OUTTEXTFILE=%TEMP%\csv_replace.tmp"
if exist "%OUTTEXTFILE%" del "%OUTTEXTFILE%"
set "FirstLine="
set "EndFirstLine="" "
set "BeginSecondLine="2014"
for /f "usebackq delims=" %%A in ("%INTEXTFILE%") do (
set "Line=%%A"
if not "!FirstLine!"=="" (
if "!Line:~0,5!"=="!BeginSecondLine!" (
set "FirstLine=!FirstLine!"!Line:~4!"
echo !FirstLine!>>"%OUTTEXTFILE%"
set "Line="
) else (
echo !FirstLine! >>"%OUTTEXTFILE%"
)
set "FirstLine="
)
if not "!Line!"=="" (
if "!Line:~-4!"=="!EndFirstLine!" (
set "FirstLine=!Line:~0,-2!"
) else (
echo !Line!>>"%OUTTEXTFILE%"
)
)
)
if exist "%OUTTEXTFILE%" (
copy "%OUTTEXTFILE%" "%INTEXTFILE%" >nul
del "%OUTTEXTFILE%"
)
:EndBatch
endlocal
此批处理文件也会删除空行。这是无法避免的,因为命令for
在解析文件时忽略空行。
答案 1 :(得分:0)
@ECHO OFF
SETLOCAL
(
FOR /f "delims=" %%a IN (q6288377.txt) DO (
SET line=%%a
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO(^"!line:~3!
endlocal
)
)>newfile.txt
(
FOR /f "delims=" %%a IN (q6288377.txt) DO (
SET line=%%a
SETLOCAL ENABLEDELAYEDEXPANSION
IF "!line:~1,2!"=="20" (ECHO(^"!line:~3!) else (echo(%%a)
endlocal
)
)>newfile2.txt
GOTO :EOF
如果没有明确表示期望的结果,解决“我的代码不能做我想做的事情”这个问题是非常困难的。
您的问题似乎是删除文本文件第2列和第3列中的“20”(我更改了名称以适合我的系统。)
上面的代码假设文件的每个行都是"
。第一部分任意删除第2列和第3列中的任何字符,创建newfile.txt
。第二个选择仅选择第2列和第3列中20
的行并删除这些列,只留下其他行并创建newfile2.txt
。
您已将要求从“”空间 空间 换行符“2014更改为3个终端空间,未说明第一行是否为一个例外(它不会以“”空格 空格 换行符),因此上述内容可能不适用。不知道是否序列的存在是否重要 - 并且很可能像sed
这样的实用程序更适合任务(Google是你的朋友)
[编辑扩展问题]
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
PUSHD "%sourcedir%"
FOR %%u IN (q6288377*.txt) DO (
(
FOR /f "usebackqdelims=" %%a IN ("%%u") DO (
SET line=%%a
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO(^"!line:~3!
endlocal
)
)>%%~nu.xtx
)
popd
GOTO :EOF
您需要更改sourcedir
的设置以适合您的具体情况。生成的文件将是 samename .xtx。不要试图直接覆盖现有文件。
您还可以通过在%%~nu.xtx
前加一个目录名称来创建不同目录中的新文件,例如“c:\ some random \ directory \ %% ~nu.xtx” - “括在引号中”如果目录或文件名包含分隔符(如空格)。 ~nu
表示“%%u
的名称 - 请参阅提示中的 /?以获取更多信息。
解决整个问题总比解决问题容易。完整描述可能会影响使用的方法。