有多个文本文件,内容类似,其中一个a.txt如下:
1.abc.de
2、efg;.hijk
3.lmn;opq
4rst.uvw
xyz1.23
ghilk45、234
我现在要将以上文本中以数字开头,紧接着是逗号或顿号的段落前增加一个换行符,如果数字后跟着的是逗号则换成顿号。如将上文转换后的结果如下:
1、abc.de
2、efg;.hijk
3、lmn;opq
4rst.uvw
xyz1.23
ghilk45、234
我写了如下P处理,
setlocal enabledelayedexpansion
for /f "tokens=1,* delims=、." %%a in (a.txt) do (
set a=%%a
set b=%%b
echo !a!|findstr "^[0-9]*$">nul && echo.>>b.txt
echo !a!、!b!>>b.txt
)
可是它将4rst.uvw和xyz1.23中的逗号也替换成了顿号。请大家完善一下,如何避免这种情况。
Originally posted by hgx126 at 2010-3-25 23:12:
可是它将4rst.uvw和xyz1.23中的逗号也替换成了顿号。请大家完善一下,如何避免这种情况。
因为 "delims=、." 是全文本内进行分隔的。
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
set i=%%i
set j=!i:~1,1!
set j=!j:.=、!
echo !i:~0,1!|findstr "[0-9]">nul
if !ERRORLEVEL!==0 (
if "!j!"=="、" (
echo.
echo !i:~0,1!!j!!i:~2!
) else echo %%i
) else echo %%i
)>>b.txt
for /f "delims=" %%i in (a.txt) do i解析文本,不以任何字符为分隔符号
set i=%%将每行赋值给变量i
set j=!i:~1,1!和set j=!j:.=、!获取第二个字符,将.和、都替换成、
echo !i:~0,1!|findstr "[0-9]">nul检查行首第一个字符是否为数字,是则返回0,不是则返回1
if !ERRORLEVEL!==0 ...... else echo %%i检查返回代码,是则...否则原样输出
if "!j!"=="、" ...... else echo %%i如果第二个字符是、则...否则原样输出
echo.&echo !i:~0,1!!j!!i:~2!指定输出效果
[
Last edited by Hanyeguxing on 2010-3-26 at 00:58 ]
那就换种脚本吧:
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var newText = "", temp;
var f = fso.OpenTextFile("a.txt", 1);
while(!f.AtEndOfStream) {
temp = f.ReadLine();
if(/^\d+[\.|、].*$/.test(temp)) {
temp = temp.replace(/^(\d+)[\.|、](.*)$/,"$1、$2");
newText += "\r\n";
}
newText += "\r\n" + temp;
}
fso.CreateTextFile("b.txt", true, false).Write(newText);