中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]难题,再更新,还继续求助中:如何替换~|为☆
« [1] [2] »
作者:
标题: [求助]难题,再更新,还继续求助中:如何替换~|为☆ 上一主题 | 下一主题
cny798
新手上路





积分 18
发帖 18
注册 2008-12-18
状态 离线
『楼 主』:  [求助]难题,再更新,还继续求助中:如何替换~|为☆

请问,如何用批处理的命令把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 ]

2010-7-23 01:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Taurus
新手上路





积分 0
发帖 8
注册 2008-8-6
状态 离线
『第 2 楼』:  

@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-7-23 12:57


2010-7-23 03:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cny798
新手上路





积分 18
发帖 18
注册 2008-12-18
状态 离线
『第 3 楼』:  



  Quote:
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

非常感谢您的回复,但这是错误的,因为~与|都是特殊字符,这样是不行的。

2010-7-23 12:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
WANKOILZ
初级用户





积分 198
发帖 89
注册 2007-9-6
来自 重庆
状态 离线
『第 4 楼』:  

我来钻个空子先(不要拿鸡蛋砸我啊...):
@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-7-23 14:43


2010-7-23 14:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
defanive
初级用户





积分 111
发帖 62
注册 2007-12-31
状态 离线
『第 5 楼』:  

想不出什么办法了,只好枚举字串符
@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-7-23 21:13


2010-7-23 15:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cny798
新手上路





积分 18
发帖 18
注册 2008-12-18
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by defanive at 2010-7-23 15:17:
想不出什么办法了,只好枚举字串符
[code]@echo off
setlocal enabledelayedexpansion
set/p str=<1.txt
set ptr=0,pre=0
:loop
if "!str:~%ptr%,2!"=="~|" (
        se ...

首先,非常感谢这位朋友的回复。
其次,这段代码还是有点问题,遇到1.txt的内容出现换行时,它只会“翻译”第一段,就停止了。(即:遇到换行之后的内容,不会继续运行)


2010-7-23 21:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
defanive
初级用户





积分 111
发帖 62
注册 2007-12-31
状态 离线
『第 7 楼』:  

大可自己改下。。。
我读取只读了第一行,你读多几行就是了。。。

2010-7-23 21:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 8 楼』:  


@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 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2010-7-24 08:14
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 9 楼』:  

保存下面代码为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 ]

2010-7-24 11:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cny798
新手上路





积分 18
发帖 18
注册 2008-12-18
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by netbenton at 2010-7-24 08:14:
[code]@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!

2010-7-24 14:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
defanive
初级用户





积分 111
发帖 62
注册 2007-12-31
状态 离线
『第 11 楼』:  


@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-7-24 15:41


2010-7-24 14:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cny798
新手上路





积分 18
发帖 18
注册 2008-12-18
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by freeants001 at 2010-7-24 11:11:
保存下面代码为doit.bat,命令提示符下输入doit   d:\1.txt试试:

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

谢谢这位朋友的回复,但这段代码调用到debug.exe了,在Win7里不兼容,同时,由于条件限制,也不能调用debug.exe,期待有更理想的作品,谢谢。

2010-7-24 15:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cny798
新手上路





积分 18
发帖 18
注册 2008-12-18
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by defanive at 2010-7-24 14:53:
[code]@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 ]

2010-7-24 15:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
defanive
初级用户





积分 111
发帖 62
注册 2007-12-31
状态 离线
『第 14 楼』:  

这样你还是用第三方吧。。。
我只想看还有没别的方法。。。

2010-7-24 17:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 15 楼』:  

setlocal disabledelayedexpansion
哦~~这个是从你那里粘贴来的,为什么要disabel呢,难道文本里面不有!号吗?
改成
setlocal enabledelayedexpansion
应该可以了的,可是在速度上来说,你还是用三方吧



精简
[你的+我的+他的]=>[大家的]    个人网志   
2010-7-24 19:40
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: