[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理怎样求两列数字的关系?

数学问题,原谅我数学很差,不善于处理各种数字的关系,哈哈!~
有一文档内容如下:
  1. 1   0   我
  2. 1   1   想
  3. 1   2   吃
  4. 1   2   吃
  5. 2   2   吃饭
  6. 1   3   饭
复制代码

第一列数字是字符个数,第二列数字是字符位置(偏移量?),如何处理数字才能得到“我想吃饭”这句话?
我:字符个数为 1 个,位置为 0 ;
想:字符个数为 1 个,位置为 1 ;
吃饭:字符个数为 2 个,位置为 3 ,算“吃”字的位置,“饭”字的字符位置不提示。
再如:我爱北京天安门门楼的门
  1. 1   0   我
  2. 1   1   爱
  3. 1   1   爱
  4. 2   2   北京
  5. 3   4   天安门
  6. 1   5   安
  7. 1   6   门
  8. 1   7   门
  9. 2   7   门楼
  10. 1   9   的
  11. 1   10   门
复制代码

建议不要用a,b,c这类变量。。。

我代码的变量名是有意义的。
建议你将echo off改为echo on,在cmd里面执行一步步的看执行结果。
适当的在循环中加echo和pause

你参考你8楼的想法看这个代码。

TOP

先谢了,明天有空了再请教你,先休息,晚安!~

TOP

这个是8L你的那个方法,取消了字符截取应该快些

  1. @echo off&setlocal enabledelayedexpansion
  2. Set iCurOffset=0
  3. Set iNextOffset=0
  4. Set iCurMax=0
  5. Set strOutString=
  6. for /f "tokens=1,2,3" %%i in (S.txt) do (
  7.     if %%j GTR !iCurOffset! (
  8.         if %%j EQU !iNextOffset! (
  9.             Set strOutString=!strOutString!!strLine!
  10.             Set iCurOffset=%%j
  11.             Set iCurMax=0
  12.             
  13.         )
  14.     )
  15.     if %%j EQU !iCurOffset! (
  16.         if %%i GTR !iCurMax! (
  17.             Set iCurMax=%%i
  18.             Set strLine=%%k
  19.             Set /a iNextOffset=%%i+%%j
  20.         )
  21.     )
  22. )
  23. echo %strOutString%%strLine%
  24. pause
复制代码

TOP

非常谢谢 slore 兄!~
先前我将它与其它代码合放在同一个BAT里,可能冲突还是干啥的没起作用,刚才独立出来发现可以使用!~
我想你的思路就是我想找的思路,因为技术有限无法解释清楚。
类似你那代码我接触过多次,可我一直没有用心去研究,所以看得云里雾里,呵呵,非常感谢!~

TOP

在你那边显示吗?

都说过了。。。

原帖由 slore 于 2010-8-27 23:50 发表
这个我不清楚。。。

我想吃饭 和 我爱北京天安门门楼的门
都可以正常显示。


你保存叫a.txt么?

TOP

MergeStr可以简化掉判断语句

  1. :MergeStr
  2. Set /a iMore=%1-%iCurLen%
  3. Set strNewWord=%2
  4. Set strOutString=%strOutString%!strNewWord:~-%iMore%!
  5. Set /a iCurLen=%1
复制代码

TOP

原帖由 slore 于 2010-8-27 23:50 发表
这个我不清楚。。。

我想吃饭 和 我爱北京天安门门楼的门
都可以正常显示。


你最好把你的文本发出来。。。

如果格式正确不应该不行的。

确定 按第二列升序再第一列升序的文件内容才可以。

初步认为 ...


兄弟,我直接复制一楼的代码测试的,什么都没显示!~
在你那边显示吗?

TOP

这个我不清楚。。。

我想吃饭 和 我爱北京天安门门楼的门
都可以正常显示。


你最好把你的文本发出来。。。

如果格式正确不应该不行的。

确定 按第二列升序再第一列升序的文件内容才可以。

初步认为你后面的格式应该有问题。

TOP

原帖由 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 ...

终于看到了点曙光,可是,我换了两个文本都没见有显示呢?

TOP

头疼啊ing……那些高手怎么个个都噤声了呢?谁出来支个招1~

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. Set iCurOffset=0
  3. Set iCurLen=-1
  4. Set strOutString=
  5. for /f "tokens=1,2,3" %%i in (a.txt) do (
  6.     if %%j GEQ !iCurOffset! (
  7.         Set /a iLineLen=%%i+%%j
  8.         if !iLineLen! GTR !iCurLen! (
  9.             Call :MergeStr !iLineLen! %%k
  10.         )
  11.         Set /a iCurOffset=%%j
  12.     )
  13. )
  14. echo %strOutString%
  15. pause
  16. goto :EOF
  17. :MergeStr
  18. Set /a iMore=%1-%iCurLen%
  19. Set strNewWord=%2
  20. if %iCurLen%==-1 (Set strOutString=%2) else (
  21.     Set strOutString=!strOutString:~0,%iCurLen%!!strNewWord:~-%iMore%!
  22. )
  23. Set /a iCurLen=%1
复制代码

[ 本帖最后由 slore 于 2010-8-27 23:47 编辑 ]

TOP

原帖由 wankoilz 于 2010-8-27 21:16 发表
这个估计需要“智能”了。比如 4   天安门 和 5   安 6   门 ,4和5、6意思重复了,但是“意思是否重复”需要人为判断了...批处理只能干机械的事,呵呵O(∩_∩)O~


兄弟,既然给出了数字,那么你就可以从数学关系上去解决问题。前面说了,字符个数+偏移量=下一个词语的偏移量!~
据此得到:
  1. 1+0=1 我
  2. 1+1=2 爱
  3. 2+2=4 北
  4. 3+4=7 天
  5. 2+7=9 门
  6. 1+9=10 门
复制代码

再根据字符个数判断每个字后面是否存在其它字符,得到:
  1. 1+0=1 我
  2. 1+1=2 爱
  3. 2+2=4 北京
  4. 3+4=7 天安门
  5. 2+7=9 门楼
  6. 1+9=10 的
  7. 1+10=11 门
复制代码

TOP

回复 6楼 的帖子

这个估计需要“智能”了。比如 4   天安门 和 5   安 6   门 ,4和5、6意思重复了,但是“意思是否重复”需要人为判断了...批处理只能干机械的事,呵呵O(∩_∩)O~

TOP

原帖由 wankoilz 于 2010-8-27 20:45 发表
楼主意思应该是 只要偏移量不同都该出现在句子中吗?那你第一个样本 2 吃饭 和 3 饭 是不是有点问题...
下面代码可以满足第二个样本echo off&setlocal enabledelayedexpansion
for /f "tokens=2,3" %%i in (a.tx ...

谢谢,要把多余的字符去掉,只要这句话“我爱北京天安门门楼的门

TOP

返回列表