[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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   门
复制代码

字符个数与字符位置(偏移量\指针)没有任何关系呀.

TOP

问题:如果出现矛盾数据怎么办?

TOP

有关系啊!~
字符个数+偏移量=下一个词语的偏移量!~
然后用这个加出来的偏移量与实际偏移量比较,提取相等的偏移量对应下的词语即可。
看来还是得靠自己了!~

TOP

楼主意思应该是 只要偏移量不同都该出现在句子中吗?那你第一个样本 2 吃饭 和 3 饭 是不是有点问题...
下面代码可以满足第二个样本:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=2,3" %%i in (a.txt) do (set _%%i=%%j&set/a n+=1)
  3. for /l %%i in (0,1,%n%) do set/p=!_%%i!<nul
  4. echo;&pause
复制代码

TOP

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

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

TOP

回复 6楼 的帖子

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

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

  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

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

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

这个我不清楚。。。

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


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

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

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

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

TOP

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

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


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

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

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

初步认为 ...


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

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 发表
这个我不清楚。。。

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


你保存叫a.txt么?

TOP

返回列表