中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-12 03:28
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]难题,再更新,还继续求助中:如何替换~|为☆ 查看 2,466 回复 15
楼 主 [求助]难题,再更新,还继续求助中:如何替换~|为☆ 发表于 2010-07-23 01:39 ·  中国 福建 厦门 电信
新手上路
积分 18
发帖 18
注册 2008-12-18 21:51
17年会员
UID 134292
性别 男
状态 离线
请问,如何用批处理的命令把1.txt里的~|替换为☆?(不能用其它软件)谢谢帮助的朋友(小提醒,1、“~|”两个字符都是特殊转义字符,需要留意;2、要留意换行等格式不能变;3、实际需求中,文件内容大约是下面文件的五万倍以上,每天都需要做此替换工作,所以也请考虑一下程序的运行效率问题,谢谢谢谢。----2010.07.24 15:32)


1.txt的内容
Country~|Case No~|Journal ID~|Case Login Name~|Case Creation Date/Time~|Case Created By Dept~|Journal Creation Date/Time~|Journal Created By Dept~|Journal Login Name~|Log Status~|Service Request No~|Current Status~|Service Code~|Resolution Code~|Component Code~|Cause Code~|
Reason Code~|Case Summary~|Service Tag~|LOB~|Item Family~|Customer Code~|Email~|Support


2.txt的内容
Country☆Case No☆Journal ID☆Case Login Name☆Case Creation Date/Time☆Case Created By Dept☆Journal Creation Date/Time☆Journal Created By Dept☆Journal Login Name☆Log Status☆Service Request No☆Current Status☆Service Code☆Resolution Code☆Component Code☆Cause Code☆
Reason Code☆Case Summary☆Service Tag☆LOB☆Item Family☆Customer Code☆Email☆Support


案例:
错误的程序

@echo off
setlocal disabledelayedexpansion
set oldfile="d:\1.txt"
set newfile="d:\2.txt"

if exist d:\2.txt del d:\2.txt

(for /f "tokens=*" %%a in ('findstr /n .* %oldfile%') do (
set var=%%a
setlocal enabledelayedexpansion
if "!var:*:=!"=="" (echo;) else (
set var=!var:*:=!
echo;!var:^~^|=☆!
)
endlocal
))>%newfile%

[ Last edited by cny798 on 2010-7-24 at 16:04 ]
2 发表于 2010-07-23 03:38 ·  中国 香港 城市电讯有限公司
新手上路
积分 0
发帖 8
注册 2008-08-06 16:33
18年会员
UID 122832
性别 男
状态 离线
@echo off
for /f "delims=" %%i in ('more 1.txt') do (
set str=%%i
call set str=%%str:^|=☆%%
call echo %%str%%
)
pause
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
slore +1 2010-07-23 12:57
3 发表于 2010-07-23 12:53 ·  中国 福建 厦门 电信
新手上路
积分 18
发帖 18
注册 2008-12-18 21:51
17年会员
UID 134292
性别 男
状态 离线
Originally posted by Taurus at 2010-7-23 03:38:
@echo off
for /f "delims=" %%i in ('more 1.txt') do (
set str=%%i
call set str=%%str:^|=☆%%
call echo %%str%%
)
pause



非常感谢您的回复,但这是错误的,因为~与|都是特殊字符,这样是不行的。
4 发表于 2010-07-23 14:30 ·  中国 重庆 电信
初级用户
★★
积分 198
发帖 89
注册 2007-09-06 23:22
18年会员
UID 96746
性别 男
来自 重庆
状态 离线
我来钻个空子先(不要拿鸡蛋砸我啊...):
@echo off
(for /f "delims=" %%i in ('findstr /n .* 1.txt') do (
set "str=%%i"
setlocal enabledelayedexpansion
if "!str:*:=!"=="" (echo;) else (
set str=!str:*:=!
echo;!str:^|=☆!
)))
echo 请复制粘贴!&pause>nul
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
cny798 -1 2010-07-23 14:43
5 发表于 2010-07-23 15:17 ·  中国 广东 广州 电信
初级用户
★★
积分 111
发帖 62
注册 2007-12-31 20:10
18年会员
UID 107336
性别 男
状态 离线
想不出什么办法了,只好枚举字串符
@echo off
setlocal enabledelayedexpansion
set/p str=<1.txt
set ptr=0,pre=0
:loop
if "!str:~%ptr%,2!"=="~|" (
set /a lng=ptr-pre
call set new=!new!%%str:~!pre!,!lng!%%☆
set /a pre=ptr+2
)
if "!str:~%ptr%,2!"=="" (
set new=!new!!str:~%pre%!
echo !new!>2.txt
exit
)
set /a ptr+=1
goto loop
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
cny798 +1 2010-07-23 21:13
6 发表于 2010-07-23 21:10 ·  中国 福建 厦门 电信
新手上路
积分 18
发帖 18
注册 2008-12-18 21:51
17年会员
UID 134292
性别 男
状态 离线
Originally posted by defanive at 2010-7-23 15:17:
想不出什么办法了,只好枚举字串符
@echo off
setlocal enabledelayedexpansion
set/p str=<1.txt
set ptr=0,pre=0
:loop
if "!str:~%ptr%,2!"=="~|" (
se ...



首先,非常感谢这位朋友的回复。
其次,这段代码还是有点问题,遇到1.txt的内容出现换行时,它只会“翻译”第一段,就停止了。(即:遇到换行之后的内容,不会继续运行)
7 发表于 2010-07-23 21:25 ·  中国 广东 广州 电信
初级用户
★★
积分 111
发帖 62
注册 2007-12-31 20:10
18年会员
UID 107336
性别 男
状态 离线
大可自己改下。。。
我读取只读了第一行,你读多几行就是了。。。
8 发表于 2010-07-24 08:14 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
@echo off&setlocal enabledelayedexpansion
set oldfile="d:\1.txt"
set newfile="d:\2.txt"

if exist d:\2.txt del d:\2.txt

(for /f "tokens=*" %%a in ('findstr /n .* %oldfile%') do (
set var=%%a
set var=!var:*:=!
set str=0
for /l %%a in (1,1,30) do (
rem 用for /f 来分段处理,当前可以处理30X2段,如果更多你可以把30改大一点,不过这个值越大速度越慢
for /f "tokens=1,2* delims=~|" %%b in ("!var!") do (
if "%%b" neq "" (set str=!str!☆%%a☆%%b) else (set str=!str!☆%%a)
set var=%%c
)
)
echo;!str:~2!
))>%newfile%
endlocal


[ Last edited by netbenton on 2010-7-23 at 23:36 ]
精简
=> 个人网志
9 发表于 2010-07-24 11:11 ·  中国 湖北 黄石 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
20年会员
UID 53823
性别 男
来自 湖北
状态 离线
保存下面代码为doit.bat,命令提示符下输入doit d:\1.txt试试:


@echo off&setlocal ENABLEDELAYEDEXPANSION
cd/d "%~dp0">nul
set/a D_NUM=%~z1+255
call:DEC_HEX %D_NUM% >nul
for /f "eol=- skip=1 tokens=*" %%i in ('^(echo d100,%FILE_SIZE%^&echo q^)^|debug %~s1') do (
set op=%%i
set op=!op:-= !
set op=!op:7E=A1!
set op=!op:7C=EE!
echo e!op:~5,53! 2>nul >>"%~n1.$"
)
echo rcx>>"%~n1.$"
call:DEC_HEX %~z1 >nul
echo %FILE_SIZE%>>"%~n1.$"
echo n$tmp$>>"%~n1.$"
echo w>>"%~n1.$"
echo q>>"%~n1.$"
debug<"%~n1.$"
ren $tmp$ dstfile.txt
del/a/q $tmp$ "%~n1.$"
start notepad dstfile.txt
goto :EOF

:DEC_HEX
set FILE_SIZE=
set PATTERN=123456789ABCDEF
set dec=%1
:WHILE
set /a res=%dec%%%16-1
set /a dec/=16
set res=!PATTERN:~%res%,1!
set FILE_SIZE=%res%%FILE_SIZE%
if "%dec%" neq "0" goto WHILE
goto:eof


[ Last edited by freeants001 on 2010-7-24 at 12:46 ]
10 发表于 2010-07-24 14:28 ·  中国 福建 厦门 电信
新手上路
积分 18
发帖 18
注册 2008-12-18 21:51
17年会员
UID 134292
性别 男
状态 离线
Originally posted by netbenton at 2010-7-24 08:14:
@echo off&setlocal disabledelayedexpansion
set oldfile="d:\1.txt"
set newfile="d:\2.txt"

if exist d:\2.txt del d:\2.txt

(for /f "tokens=*" %%a in ('f ...



这位朋友,首先,感谢您的回复;其次,您的程序是错误的,您可以测试一下,运行结果如下:

!str:~2!
!str:~2!
!str:~2!
!str:~2!
!str:~2!
!str:~2!
!str:~2!
!str:~2!
11 发表于 2010-07-24 14:53 ·  中国 广东 广州 番禺区 电信
初级用户
★★
积分 111
发帖 62
注册 2007-12-31 20:10
18年会员
UID 107336
性别 男
状态 离线
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
set "str=%%a"
call :sub
)
goto :eof
:sub
set ptr=0
set pre=0
set "new="
:loop
if "!str:~%ptr%,2!"=="~|" (
set /a lng=ptr-pre
call set new=!new!%%str:~!pre!,!lng!%%☆
set /a pre=ptr+2
)
if "!str:~%ptr%,2!"=="" (
set new=!new!!str:~%pre%!
echo !new!>>2.txt
goto :eof
)
set /a ptr+=1
goto loop

。。。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
cny798 +1 2010-07-24 15:41
12 发表于 2010-07-24 15:33 ·  中国 福建 厦门 电信
新手上路
积分 18
发帖 18
注册 2008-12-18 21:51
17年会员
UID 134292
性别 男
状态 离线
Originally posted by freeants001 at 2010-7-24 11:11:
保存下面代码为doit.bat,命令提示符下输入doit d:\1.txt试试:


@echo off&setlocal ENABLEDELAYEDEXPANSION
cd/d "%~dp0">nul
set/a D_NUM=%~z1+255 ...



谢谢这位朋友的回复,但这段代码调用到debug.exe了,在Win7里不兼容,同时,由于条件限制,也不能调用debug.exe,期待有更理想的作品,谢谢。
13 发表于 2010-07-24 15:40 ·  中国 福建 厦门 电信
新手上路
积分 18
发帖 18
注册 2008-12-18 21:51
17年会员
UID 134292
性别 男
状态 离线
Originally posted by defanive at 2010-7-24 14:53:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
set "str=%%a"
call :sub
)
goto :eof
:sub
set ptr=0
set pre=0
set "new=" ...



非常感谢这位朋友的回复,非常感谢您的作品,这是目前为止,唯一正确的。
如果运行速度可以改善则更佳了,因为实际使用中,需要转换的文件的内容大约是例中的五万倍的大小,这段程序的运行速度确实慢了些。(用一台服务器,跑一整天时间都执行不完。)

[ Last edited by cny798 on 2010-7-24 at 16:06 ]
14 发表于 2010-07-24 17:16 ·  中国 广东 广州 番禺区 电信
初级用户
★★
积分 111
发帖 62
注册 2007-12-31 20:10
18年会员
UID 107336
性别 男
状态 离线
这样你还是用第三方吧。。。
我只想看还有没别的方法。。。
15 发表于 2010-07-24 19:40 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
setlocal disabledelayedexpansion
哦~~这个是从你那里粘贴来的,为什么要disabel呢,难道文本里面不有!号吗?
改成
setlocal enabledelayedexpansion
应该可以了的,可是在速度上来说,你还是用三方吧
精简
=> 个人网志
论坛跳转: