Board logo

标题: [文本处理] [已解决]如何给定分隔符,截取字符串最后一部分 [打印本页]

作者: xxx    时间: 2009-8-7 19:57     标题: [已解决]如何给定分隔符,截取字符串最后一部分

字符串例子(有中文、特殊符号,字符串长度不确定):
[123]-[xxx].234.123.4345.xxx.c1
[123]-[12].234.123.3123.xxx.c2

给定分隔符(delims): - .

如何能比较高效地截取字符串的最后一部分?(就是确定tokens)


可以使用第三方工具
谢谢

[ 本帖最后由 xxx 于 2009-8-7 22:29 编辑 ]
作者: inittab    时间: 2009-8-7 21:33

楼主能说的更清楚一些么。因为此问题不一定非要确定tokens 不可。

您要得到结果是什么,再给多些例子。把特殊字符,中文字符情况都放进去。
作者: xxx    时间: 2009-8-7 21:54

[灵魂歌王].Ray.2004.DVDRiP.XViD-KJS.CD2
[灵魂歌王].Ray.2004.DVDRiP.XViD-KJS.CD1

例如这个,我想获取  ”[灵魂歌王].Ray.2004.DVDRiP.XViD-KJS“ 这一部分,也就是将[灵魂歌王].Ray.2004.DVDRiP.XViD-KJS.CD2 以.、-为界,分成 [灵魂歌王] Ray 2004 DVDRiP XViD KJS CD2 这七部分,然后去掉最后一段(或其中任意一段),变成新的变量。

但是能分成多少分不能确定,而每份的长度也不能确定,不知道有什么高效的方法呢?

//
我想到个笨方法,就是用for /f逐个逐个去数,然后去掉,但是如果很长,就麻烦了,希望得到各位的指点,谢谢
作者: inittab    时间: 2009-8-7 22:05

上述的例子,如去掉最后一段,不是一样了吗? 要处理的文本存为a.txt
  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do echo;%%~ni
  3. pause
复制代码

作者: batman    时间: 2009-8-7 22:11     标题: 这样吧

仍是用for(去掉最后一部分可以扩展到去掉指定部分):
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.      set "str=%%a"&set "str=!str:.=!"&set "str=!str:-=!"
  4.      for %%b in (!str!) do set /a n+=1&set "_!n!=%%b"
  5.      set /a n-=1
  6.      for /l %%c in (1,1,!n!) do set /p=!_%%c!<nul>>new.txt
  7.      echo.>>new.txt&set /a n=0
  8. )
  9. start new.txt
复制代码

[ 本帖最后由 batman 于 2009-8-7 22:14 编辑 ]
作者: xxx    时间: 2009-8-7 22:14     标题: 回复 4楼 的帖子

那如果要去掉某一部分呢?
作者: inittab    时间: 2009-8-7 22:19

某一部分是随机的呢,还是固定的呢? 固定的好办,如果是随机的要费一多番思考.

以下是去掉第三列。
  1. @echo off
  2. for /f "tokens=1,2,4,* delims=-." %%i in (a.txt) do echo;%%i.%%j.%%k.%%l
  3. pause
复制代码

作者: batman    时间: 2009-8-7 22:19     标题: 回复楼上,修改我5楼的代码就可以了

假设要去掉的是第二部分:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.      set "str=%%a"&set "str=!str:.=!"&set "str=!str:-=!"
  4.      for %%b in (!str!) do set /a n+=1&set "_!n!=%%b"
  5.      for /l %%c in (1,1,!n!) do if !n! neq 2 set /p=!_%%c!<nul>>new.txt
  6.      echo.>>new.txt&set /a n=0
  7. )
  8. start new.txt
复制代码

作者: batman    时间: 2009-8-7 22:21     标题: 回7楼

如字符串超长怎么办,假设有40段,而要去掉其中的第38段?
作者: xxx    时间: 2009-8-7 22:25     标题: 回复 9楼 的帖子

其实就是害怕有这种情况

你的代码思路就是数出分段数的吧?但是如果到了很大的长度的时候是不是会用影响呢?
作者: inittab    时间: 2009-8-7 22:28

楼上考虑比较周到,此类问题具体问题具体分析。bat 代码都是很有针对性的。

我7楼给的代码只能用在去掉31列以内,呵呵。我的看法是

1,符合要求是前提。功能方面.
2,高效

[ 本帖最后由 inittab 于 2009-8-7 22:29 编辑 ]
作者: batman    时间: 2009-8-7 22:28     标题: 回复10楼

只要你的段数不是无限长就行,对了,问题解决了请在标题上加注[已解决]字样。。。
作者: xxx    时间: 2009-8-7 22:30

嗯,谢谢各位,看看能不能有其他更好的方法来处理,提高效率。(正则和unix下的文本流工具应该是不错的选择)
作者: zqz0012005    时间: 2009-8-7 23:13     标题: 还是js上阵比较合适

JavaScript
  1. //&@cls&start wscript -e:jscript "%~f0"&exit/b
  2. intNode = -1; //负数-n表示去掉倒数第n段
  3. f = "C:\\Documents and Settings\\user\\桌面\\a.txt"; //可以只写相对路径
  4. fso = new ActiveXObject("Scripting.FileSystemObject");
  5. ts = fso.OpenTextFile(f);
  6. s = '';
  7. while (!ts.AtEndOfStream)
  8.     s += remove(ts.ReadLine()) + '\n';
  9. //WScript.Echo(s);
  10. fso.OpenTextFile('b.txt',2,true).Write(s);
  11. function remove(ss) {
  12.     var arr = ss.split('.').join('-').split('-');
  13.     if(intNode>0) {var n=intNode-1;} else {var n=arr.length+intNode}
  14.     arr.splice(n,1);
  15. return arr.join(' ');
  16. }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2