Board logo

标题: 文件的文字与字母替换问题? [打印本页]

作者: zouzhxi     时间: 2006-10-15 10:36    标题: 文件的文字与字母替换问题?

我想对一文本文件里边有英文字母替换成我想要的字符,这个功能能实现吗?

比如:我想对字母R替换成"日",r替换成"人"等等。。。

可以让我自己控制某个字母替换成特定字符。。。

!!!!


[ Last edited by namejm on 2006-10-15 at 11:10 ]
作者: 不得不爱     时间: 2006-10-15 10:48
你到底要替换些什么?
作者: electronixtar     时间: 2006-10-15 10:52
用记事本嘛。要用 正则的话用UltraEdit 即可
作者: namejm     时间: 2006-10-15 10:54
  只要你想把某个字母换成指定字符,在CMD下都是可行的——换成敏感字符除外。请把你要转换的具体内容帖出来。

  另外,请不要把字号弄得太大。虽然你可能很着急,但是字体太大会很占版面,给论坛的管理带来不便。
作者: zouzhxi     时间: 2006-10-15 11:05
我就是想把下面这段字符

  Quote:
M1QJZSHQ200D00A01e01e00WCWB00WIBC00W01H00W02901A01B01D01A01901D01901E01A02B00D00A01e01e00WDe100WIBC00W01H00W02902K01F02K01B02K02b02M01F02B00D00ALBPC11CWBIBC00W01H00W02901B01B01801D01901901801G01F01D01701F01801A01B01G01E01902B00D00AF89IIcMY6N9W00W01H00W02902e02T02Z02d02N02e02M02B00D00AF89IIcIW2Fa500W01H00W02902e02T02Z02d02N02e02M02J02S02L02B00D00ADcMCGCM1FIYD00W01H00W02902e02T02Z02e02M02c02N01N01801D01A01502H02T02R02B

相对应的换成下面文字

  Quote:
A=啊 a=阿 B=不 b=把 C=才 c=出 ……
0=a 1=o 2=e 3=u 4=i 5=u 6=v 7=l 8=b 9=y

就可以了。就这么简单...
作者: namejm     时间: 2006-10-15 11:09
  请把你的字母转换清单列完,不列完没法写代码。
作者: 不得不爱     时间: 2006-10-15 11:10
那你还不如用记事本来完成
作者: lxmxn     时间: 2006-10-15 12:01

  强烈建议楼主用记事本或者其它的第三方文本编辑工具完成这个任务,如果用批处理来解决的话,这样将会死很多脑细胞。
 
  望楼主三思而行。

作者: namejm     时间: 2006-10-15 12:47
  其实用批处理来解决是可行的,并且效率也比较高。比如,用如下代码就可以实现第5楼的部分功能(因为部分替换会多次执行而导致结果不准确,所以剔除了部分替换规则):
@echo off
cd.>2.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
    set var=%%i
    set "var=!var:A=啊!"
    set "var=!var:a=阿!"
    set "var=!var:B=不!"
    set "var=!var:b=把!"
    set "var=!var:C=才!"
    set "var=!var:c=出!"
    set "var=!var:1=o!"
    set "var=!var:2=e!"
    set "var=!var:3=u!"
    set "var=!var:4=i!"
    set "var=!var:5=u!"
    set "var=!var:6=v!"
    set "var=!var:7=l!"
    set "var=!var:9=y!"
    >>2.txt echo !var!
)
start 2.txt

作者: redtek     时间: 2006-10-15 21:42
怎么觉得楼主这个编码象是 自创输入法的编码啊?哈哈……

[ Last edited by redtek on 2006-10-15 at 21:43 ]
作者: zouzhxi     时间: 2006-10-15 22:51
TO redtek:
这是别人给我的一个文件,,告诉我说,只要用特定字符替换掉里边的字母数字就可以知道是什么东东了.我也没办法,,,,

TO lxmxn:
你说用记事本,如果有很多(就是说比上面的多呢.一个一个替换太烦人了.)怎么办.
作者: zouzhxi     时间: 2006-10-15 23:10


  Quote:
Originally posted by namejm at 2006-10-15 12:47:
  其实用批处理来解决是可行的,并且效率也比较高。比如,用如下代码就可以实现第5楼的部分功能(因为部分替换会多次执行而导致结果不准确, ...

  Quote:
@echo off
cd.>2.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
    set var=%%i
    set "var=!var:A=啊!"
    set "var=!var:a=阿!"
    set "var=!var:B=不!"
    set "var=!var:b=把!"
    set "var=!var:C=才!"
    set "var=!var:c=出!"
    set "var=!var:1=o!"
    set "var=!var:2=e!"
    set "var=!var:3=u!"
    set "var=!var:4=i!"
    set "var=!var:5=u!"
    set "var=!var:6=v!"
    set "var=!var:7=l!"
    set "var=!var:9=y!"
    >>2.txt echo !var!
)
start 2.txt


怎么用起来大小写不分...这怎么解决???

[ Last edited by zouzhxi on 2006-10-15 at 23:11 ]
作者: kingchain     时间: 2006-10-15 23:55
学习ing
作者: 无奈何     时间: 2006-10-16 00:08
你的问题用 linux & unix 下的 tr 命令再合适不过了。
sed 也可以完成 tr 的命令,试试下面的代码:
sed "y/AaBbCc0123456789/啊阿不把才出aoeuiuvlby/" file.txt
sed 下载地址:http://www.student.northpark.edu/pemente/sed/gsed407x.zip
作者: zouzhxi     时间: 2006-10-16 01:35
我想用批处理来实现...!!!
作者: namejm     时间: 2006-10-16 10:37
  看来set命令无法区分大小写,纯批处理恐怕难以实现,楼主还是去试试无奈何兄提供的sed命令吧,没必要强求用纯批处理来解决吧?
作者: pengfei     时间: 2006-10-16 11:20
在9楼namejm版主代码的基础上修改了一下, 可以区别大小写.
@echo off
cd.>2.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do (
    set var=%%i
    call :go
    set "var=!var:1=o!"
    set "var=!var:2=e!"
    set "var=!var:3=u!"
    set "var=!var:4=i!"
    set "var=!var:5=u!"
    set "var=!var:6=v!"
    set "var=!var:7=l!"
    set "var=!var:9=y!"
    >>2.txt echo !var!
)
start 2.txt
exit

:go
set tmp=%var%@
set var=
:go_
if not "%tmp:~0,1%"=="@" (
    set var_=%tmp:~0,1%
    if "!var_!"=="A" set var_=啊
    if "!var_!"=="a" set var_=阿
    if "!var_!"=="B" set var_=不
    if "!var_!"=="b" set var_=把
    if "!var_!"=="C" set var_=才
    if "!var_!"=="c" set var_=出
    set var=!var!!var_!
    set tmp=!tmp:~1!
    goto go_
)
goto :eof
[ Last edited by pengfei on 2006-10-16 at 21:36 ]
作者: namejm     时间: 2006-10-16 11:37
  pengfei 的代码是通过探测每一个字符来替换的,用了 if 可以区别大小写的特性,思路确实不错。

  使用这段代码来处理小块文本内容还是可行的,如果文本内容很多的话,速度就会比较慢了。楼主可以综合考虑一下。
作者: redtek     时间: 2006-10-16 11:41


  Quote:
Originally posted by zouzhxi at 2006-10-15 22:51:
TO redtek:
这是别人给我的一个文件,,告诉我说,只要用特定字符替换掉里边的字母数字就可以知道是什么东东了.我也没办法,,,,

TO lxmxn:
你说用记事本 ...

别人给你的这个文件,用个工具替换一下就可以~:)
因为这只是一次性的,你的朋友或许给你这样类型的文件只有这一次,不会经常,
而且解码要求只有一小部分,就是做完了自动处理也只是个半成品,
(从心理因素讲:做半成品给朋友用自己也接受不了,没有挑战性和成就感,象是在打杂儿)
(       就像是走了一半将要到美丽公园的路,而中途不去就回家了一样,哈哈)

一次的文件还是用一些工具替换比较好~:)

但我猜这可能不是一次性的文件处理,
有可能是SQL存储上要用的私人性质编码和解码、
或是某个JavaScript上要用到的简单加密方式、
或是聊天要用到的明文简单加密编码,可能防止特殊字符或命令过滤或方便处理、
或是自定义上的象BASE64一样的编码和解码的应用、
或是某种日记等带有保密性的文档的自定义私有编码与解码等、
或是公司内部要求对某个文件内容进行的类似性的解码(如输入法、对照码表……)

所以,实际你上面的问题,如果每行数量不固定,如果有上万行,还含有特殊符号,等等……很多问题都会影响批处理的解决速度和解决办法。
例:几万行和几行的处理方法和算法也是不一样的:)

所以,如果你的内容不保密可以全上传上来让大家帮助你一起想办法。
请说明这件事的非常详细的应用(如果没有私人或企业秘密等条件所约束的话)~:)


) 一次的转换还是用工具好~:)
) 天天要用到的用批处理或调用工具的方便~:)
) 必须要用DOS而不是其它外部工具,这不太明白……(似乎要经常处理这些对吧?)
作者: zouzhxi     时间: 2006-10-17 01:20
TO redtek:

是的,我朋友发给我的文件都是这样的,我不得不重复翻出来,所以我想写一个批处理,,,不想用其他工具(因为烦琐),批处理我一次执行就可以了....
作者: zouzhxi     时间: 2006-10-21 04:16


  Quote:
『第 17 楼』:  

在9楼namejm版主代码的基础上修改了一下, 可以区别大小写.
CODE:  [Copy to clipboard]
--------------------------------------------------------------------------------

  Quote:
@echo off
cd.>2.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do (
    set var=%%i
    call :go
    set "var=!var:1=o!"
    set "var=!var:2=e!"
    set "var=!var:3=u!"
    set "var=!var:4=i!"
    set "var=!var:5=u!"
    set "var=!var:6=v!"
    set "var=!var:7=l!"
    set "var=!var:9=y!"
    >>2.txt echo !var!
)
start 2.txt
exit

:go
set tmp=%var%@
set var=
:go_
if not "%tmp:~0,1%"=="@" (
    set var_=%tmp:~0,1%
    if "!var_!"=="A" set var_=啊
    if "!var_!"=="a" set var_=阿
    if "!var_!"=="B" set var_=不
    if "!var_!"=="b" set var_=把
    if "!var_!"=="C" set var_=才
    if "!var_!"=="c" set var_=出
    set var=!var!!var_!
    set tmp=!tmp:~1!
    goto go_
)
goto :eof


我弄了好久,用上面的办法太慢了。不太理想。有没有精简一点的,。。
作者: redtek     时间: 2006-10-21 22:38
还有一种方法(只是原理):


) 读全部变量到数组(可以模拟出数组功能来)
) 以数组内容为目的标签直接跳转

) 大写A与小写a同样指向标签A,在标签A内用IF判断大小写并替换
  优点:二选一的方式只针对指定的字母,节省了每个字母都用IF判断的时间。

     也就是说:只要替换内容分为大小写的,一次判断就够:
     因为:如果 IF判断字母为大写(每个数组只装一个字符,省去了:~的提取运算),
        那么就按大写的方式替换,否则一定是小写!所以一次判断解决。

  如果是遇到其它符号,不管!反正是按数组内容跳标签的,到了属于它的标签内想怎么操作就怎么替换。

) 当数组全部走一遍之后,意味着内存中的数组内变量已全部更改替换完成
) 然后for循环再将数组内容从头到尾写回文件。

 
作者: redtek     时间: 2006-10-21 22:46
例如:

) 提取全部文本到数组,每个字符占一个数组元素。

) 以下面标签跳转:

  CALL  :数组元素1的内容
 
  就上面这一行就足够了:)


  在下面是标签:

  :A
     在标签A内来一个IF判断它是不是大写(是:替换什么字符),
     如果它不是大写,那一定是小写,替换什么。
     (所以这里一个判断就地了)
 
  :1  在1的标签内,不要判断了,直接替换就行了。
     优点: 通用,想替什么就替什么。

) 还有多少个要替换的内容往标签上加:)


) 最后当数组循环全走了一遍以后,一个FOR写文本内。
  至于写进文本内的内容是不是一个元素就占一行的问题(要多少个元素占一行)
  同样可以计算和  += 什么出来。
作者: 95219320     时间: 2006-11-12 19:06
用记事本的替换功能好了。
作者: vkill     时间: 2006-11-13 01:29
sed 解决这类问题最爽了
作者: zouzhxi     时间: 2006-11-15 03:58
这个问题差点忘了,,,
此问题未解决,,,
本人还在郁闷,,,
有没有更好的办法,,,
。。。。
作者: vkill     时间: 2006-11-16 03:58
无奈何斑竹发的很详细了,怎么还没有解决?
作者: vkill     时间: 2006-11-16 04:00
不嫌麻烦可以这样写:

sed "s/A/啊/g;s/a/阿/g;......................" life   (..........继续添加)
作者: hxuan999     时间: 2006-11-23 06:30
没说的,顶一下
作者: myddos     时间: 2007-9-6 09:49
文本文档里不是有查找替换功能?