标题: [文本处理] 批处理怎样求两列数字的关系? [打印本页]
作者: cjiabing 时间: 2010-8-27 10:50 标题: 批处理怎样求两列数字的关系?
数学问题,原谅我数学很差,不善于处理各种数字的关系,哈哈!~
有一文档内容如下:
- 1 0 我
- 1 1 想
- 1 2 吃
- 1 2 吃
- 2 2 吃饭
- 1 3 饭
复制代码
第一列数字是字符个数,第二列数字是字符位置(偏移量?),如何处理数字才能得到“我想吃饭”这句话?
我:字符个数为 1 个,位置为 0 ;
想:字符个数为 1 个,位置为 1 ;
吃饭:字符个数为 2 个,位置为 3 ,算“吃”字的位置,“饭”字的字符位置不提示。
再如:我爱北京天安门门楼的门
- 1 0 我
- 1 1 爱
- 1 1 爱
- 2 2 北京
- 3 4 天安门
- 1 5 安
- 1 6 门
- 1 7 门
- 2 7 门楼
- 1 9 的
- 1 10 门
复制代码
作者: hfg1977 时间: 2010-8-27 11:55
字符个数与字符位置(偏移量\指针)没有任何关系呀.
作者: sleepinglord 时间: 2010-8-27 17:18
问题:如果出现矛盾数据怎么办?
作者: cjiabing 时间: 2010-8-27 20:26
有关系啊!~
字符个数+偏移量=下一个词语的偏移量!~
然后用这个加出来的偏移量与实际偏移量比较,提取相等的偏移量对应下的词语即可。
看来还是得靠自己了!~
作者: wankoilz 时间: 2010-8-27 20:45
楼主意思应该是 只要偏移量不同都该出现在句子中吗?那你第一个样本 2 吃饭 和 3 饭 是不是有点问题...
下面代码可以满足第二个样本:- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=2,3" %%i in (a.txt) do (set _%%i=%%j&set/a n+=1)
- for /l %%i in (0,1,%n%) do set/p=!_%%i!<nul
- echo;&pause
复制代码
作者: cjiabing 时间: 2010-8-27 20:51
原帖由 wankoilz 于 2010-8-27 20:45 发表
楼主意思应该是 只要偏移量不同都该出现在句子中吗?那你第一个样本 2 吃饭 和 3 饭 是不是有点问题...
下面代码可以满足第二个样本echo off&setlocal enabledelayedexpansion
for /f "tokens=2,3" %%i in (a.tx ...
谢谢,要把多余的字符去掉,只要这句话“我爱北京天安门门楼的门”
作者: wankoilz 时间: 2010-8-27 21:16 标题: 回复 6楼 的帖子
这个估计需要“智能”了。比如 4 天安门 和 5 安 6 门 ,4和5、6意思重复了,但是“意思是否重复”需要人为判断了...批处理只能干机械的事,呵呵O(∩_∩)O~
作者: cjiabing 时间: 2010-8-27 21:45
原帖由 wankoilz 于 2010-8-27 21:16 发表
这个估计需要“智能”了。比如 4 天安门 和 5 安 6 门 ,4和5、6意思重复了,但是“意思是否重复”需要人为判断了...批处理只能干机械的事,呵呵O(∩_∩)O~
兄弟,既然给出了数字,那么你就可以从数学关系上去解决问题。前面说了,字符个数+偏移量=下一个词语的偏移量!~
据此得到:
- 1+0=1 我
- 1+1=2 爱
- 2+2=4 北
- 3+4=7 天
- 2+7=9 门
- 1+9=10 门
复制代码
再根据字符个数判断每个字后面是否存在其它字符,得到:
- 1+0=1 我
- 1+1=2 爱
- 2+2=4 北京
- 3+4=7 天安门
- 2+7=9 门楼
- 1+9=10 的
- 1+10=11 门
复制代码
作者: slore 时间: 2010-8-27 23:42
- @echo off&setlocal enabledelayedexpansion
- Set iCurOffset=0
- Set iCurLen=-1
- Set strOutString=
- for /f "tokens=1,2,3" %%i in (a.txt) do (
- if %%j GEQ !iCurOffset! (
- Set /a iLineLen=%%i+%%j
- if !iLineLen! GTR !iCurLen! (
- Call :MergeStr !iLineLen! %%k
- )
- Set /a iCurOffset=%%j
- )
- )
- echo %strOutString%
- pause
- goto :EOF
-
- :MergeStr
- Set /a iMore=%1-%iCurLen%
- Set strNewWord=%2
- if %iCurLen%==-1 (Set strOutString=%2) else (
- Set strOutString=!strOutString:~0,%iCurLen%!!strNewWord:~-%iMore%!
- )
- Set /a iCurLen=%1
复制代码
[ 本帖最后由 slore 于 2010-8-27 23:47 编辑 ]
作者: cjiabing 时间: 2010-8-27 23:43
头疼啊ing……那些高手怎么个个都噤声了呢?谁出来支个招1~
作者: cjiabing 时间: 2010-8-27 23:47
原帖由 slore 于 2010-8-27 23:42 发表
@echo off&setlocal enabledelayedexpansion
Set iCurOffset=0
Set iNextOffset=0
Set iCurLen=-1
Set strOutString=
for /f "tokens=1,2,3" %%i in (a.txt) do (
if %%j GEQ !iCurOffset! (
Set ...
终于看到了点曙光,可是,我换了两个文本都没见有显示呢?
作者: slore 时间: 2010-8-27 23:50
这个我不清楚。。。
我想吃饭 和 我爱北京天安门门楼的门
都可以正常显示。
你最好把你的文本发出来。。。
如果格式正确不应该不行的。
确定 按第二列升序再第一列升序的文件内容才可以。
初步认为你后面的格式应该有问题。
作者: cjiabing 时间: 2010-8-27 23:56
原帖由 slore 于 2010-8-27 23:50 发表
这个我不清楚。。。
我想吃饭 和 我爱北京天安门门楼的门
都可以正常显示。
你最好把你的文本发出来。。。
如果格式正确不应该不行的。
确定 按第二列升序再第一列升序的文件内容才可以。
初步认为 ...
兄弟,我直接复制一楼的代码测试的,什么都没显示!~
在你那边显示吗?
作者: slore 时间: 2010-8-27 23:57 标题: MergeStr可以简化掉判断语句
- :MergeStr
- Set /a iMore=%1-%iCurLen%
- Set strNewWord=%2
- Set strOutString=%strOutString%!strNewWord:~-%iMore%!
- Set /a iCurLen=%1
复制代码
作者: slore 时间: 2010-8-27 23:59
在你那边显示吗?
都说过了。。。
原帖由 slore 于 2010-8-27 23:50 发表
这个我不清楚。。。
我想吃饭 和 我爱北京天安门门楼的门
都可以正常显示。
你保存叫a.txt么?
作者: cjiabing 时间: 2010-8-28 00:07
非常谢谢 slore 兄!~
先前我将它与其它代码合放在同一个BAT里,可能冲突还是干啥的没起作用,刚才独立出来发现可以使用!~
我想你的思路就是我想找的思路,因为技术有限无法解释清楚。
类似你那代码我接触过多次,可我一直没有用心去研究,所以看得云里雾里,呵呵,非常感谢!~
作者: slore 时间: 2010-8-28 00:54 标题: 这个是8L你的那个方法,取消了字符截取应该快些
- @echo off&setlocal enabledelayedexpansion
- Set iCurOffset=0
- Set iNextOffset=0
- Set iCurMax=0
- Set strOutString=
- for /f "tokens=1,2,3" %%i in (S.txt) do (
- if %%j GTR !iCurOffset! (
- if %%j EQU !iNextOffset! (
- Set strOutString=!strOutString!!strLine!
- Set iCurOffset=%%j
- Set iCurMax=0
-
- )
- )
- if %%j EQU !iCurOffset! (
- if %%i GTR !iCurMax! (
- Set iCurMax=%%i
- Set strLine=%%k
- Set /a iNextOffset=%%i+%%j
- )
- )
- )
- echo %strOutString%%strLine%
- pause
复制代码
作者: cjiabing 时间: 2010-8-28 01:03
先谢了,明天有空了再请教你,先休息,晚安!~
作者: slore 时间: 2010-9-7 22:28
建议不要用a,b,c这类变量。。。
我代码的变量名是有意义的。
建议你将echo off改为echo on,在cmd里面执行一步步的看执行结果。
适当的在循环中加echo和pause
你参考你8楼的想法看这个代码。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |