标题: [文本处理] [已解决]如何给定分隔符,截取字符串最后一部分 [打印本页]
作者: 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- @echo off
- for /f "delims=" %%i in (a.txt) do echo;%%~ni
- pause
复制代码
作者: batman 时间: 2009-8-7 22:11 标题: 这样吧
仍是用for(去掉最后一部分可以扩展到去掉指定部分):- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set "str=%%a"&set "str=!str:.=!"&set "str=!str:-=!"
- for %%b in (!str!) do set /a n+=1&set "_!n!=%%b"
- set /a n-=1
- for /l %%c in (1,1,!n!) do set /p=!_%%c!<nul>>new.txt
- echo.>>new.txt&set /a n=0
- )
- start new.txt
复制代码
[ 本帖最后由 batman 于 2009-8-7 22:14 编辑 ]
作者: xxx 时间: 2009-8-7 22:14 标题: 回复 4楼 的帖子
那如果要去掉某一部分呢?
作者: inittab 时间: 2009-8-7 22:19
某一部分是随机的呢,还是固定的呢? 固定的好办,如果是随机的要费一多番思考.
以下是去掉第三列。- @echo off
- for /f "tokens=1,2,4,* delims=-." %%i in (a.txt) do echo;%%i.%%j.%%k.%%l
- pause
复制代码
作者: batman 时间: 2009-8-7 22:19 标题: 回复楼上,修改我5楼的代码就可以了
假设要去掉的是第二部分:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set "str=%%a"&set "str=!str:.=!"&set "str=!str:-=!"
- for %%b in (!str!) do set /a n+=1&set "_!n!=%%b"
- for /l %%c in (1,1,!n!) do if !n! neq 2 set /p=!_%%c!<nul>>new.txt
- echo.>>new.txt&set /a n=0
- )
- 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- //&@cls&start wscript -e:jscript "%~f0"&exit/b
- intNode = -1; //负数-n表示去掉倒数第n段
- f = "C:\\Documents and Settings\\user\\桌面\\a.txt"; //可以只写相对路径
- fso = new ActiveXObject("Scripting.FileSystemObject");
- ts = fso.OpenTextFile(f);
- s = '';
- while (!ts.AtEndOfStream)
- s += remove(ts.ReadLine()) + '\n';
- //WScript.Echo(s);
- fso.OpenTextFile('b.txt',2,true).Write(s);
-
- function remove(ss) {
- var arr = ss.split('.').join('-').split('-');
- if(intNode>0) {var n=intNode-1;} else {var n=arr.length+intNode}
- arr.splice(n,1);
- return arr.join(' ');
- }
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |