找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24746|回复: 7

[文本处理] [已解决]请问TXT文本怎样用批处理同时按拼音与长度排序?

[复制链接]
发表于 2012-9-23 10:57:25 | 显示全部楼层 |阅读模式
多谢CrLf大大!

示例:
  1. 哎哟
  2. 爱不释手
  3. 艾滋病
  4. 安步当车
  5. 安分
  6. 按图索骥
  7. ……
  8. 八宝粥
  9. 八竿子打不着
  10. 巴塞罗那
  11. 白皙
  12. ……
复制代码
要求排序如下:(先按拼音再按长度)

  1. 哎哟
  2. 安分
  3. 艾滋病
  4. 爱不释手
  5. 安步当车
  6. 按图索骥
  7. ……
  8. 白皙
  9. 八宝粥
  10. 巴塞罗那
  11. 八竿子打不着
  12. ……
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2012-9-24 11:06:27 | 显示全部楼层
  1. function cmp(a,b){
  2.         if(a.length==b.length) return a>b;
  3.         return a.length-b.length;
  4. }
  5. var fso = new ActiveXObject("scripting.filesystemobject");
  6. var words = fso.OpenTextFile('1.txt',1).ReadAll().split(/\r\n/);
  7. fso.OpenTextFile('ok.txt',2,1).Write(words.sort(cmp).join('\r\n'));
  8. WSH.echo('整理完成');
复制代码
保存为 整理.js 然后双击运行即可,里面的 1.txt就是你要整理的文件,整理完会生成ok.txt文件
如果 整理.js 无法运行,改名成 整理.jse 即可、
 楼主| 发表于 2012-9-24 13:29:05 | 显示全部楼层
回复 2# 乱码


    嗯,谢谢,也只能实现其中一个排序了。在按拼音排好序的基础上,再在拼音之间进行长度排序应该是实现不了的。
发表于 2012-9-24 14:31:59 | 显示全部楼层
本帖最后由 CrLf 于 2012-9-24 18:56 编辑

简单的排序:
  1. sort a.txt>b.txt
复制代码
按楼主要求的排序方式来写有点繁琐:
  1. @echo off
  2. if 测 gtr 试 echo 区域和语言设置未设置为以拼音排序&pause&exit

  3. set "$=吖 a 八 b 嚓 c 咑 d 妸 e 发 f 猤 g 妎 h 丌 j 咔 k 垃 l 嘸 m 拏 n 噢 o 妑 p 七 q 罖 r 仨 s 他 t 屲 w 夕 x 丫 y 帀 z 咗"
  4. set "py="

  5. (for /f "delims=" %%a in (a.txt) do (
  6.         for /f "tokens=*" %%b in ("%%a") do set str=%%b
  7.         setlocal enabledelayedexpansion
  8.         set "#=!str:~,1!"
  9.         set "py=!#:~,1!"
  10.         if !#! geq 吖 if !#! leq 咗 (
  11.                 set py=z
  12.                 for /l %%c in (1 1 22) do (
  13.                         for /f "tokens=1,2,3*" %%d in ("!$!") do (
  14.                                 if !#! geq %%d if !#! lss %%f (
  15.                                         set py=%%e&set $=
  16.                                 )
  17.                                 if defined $ set $=%%f %%g
  18.                         )
  19.                 )
  20.                 for /l %%b in (1 1 10) do if !str:~%%b!. neq . set "py=!py! "
  21.         )
  22.         echo !py!'%%a
  23.         endlocal
  24. ))>tmp.txt
  25. (for /f "tokens=1* delims='" %%a in ('sort tmp.txt') do echo %%b)>b.txt
  26. pause
复制代码
 楼主| 发表于 2012-9-24 15:37:46 | 显示全部楼层
回复 4# CrLf


嗯,我也觉得太繁琐了,也不太可能实现的,在A-Z拼音排序里又分好几种的,比如B,默认是先排ba,再排bai、ban、bang;C-Z后面也是一样。
所以如果先按拼音排的话,“白皙”是排不到“八宝粥”前面的;
如果要“白皙”排到“八宝粥”前面,那只有先按长度排序了;
而这个时候,“白皙”就又排到了A开头的字母那里了,不能同时做到1L所说的那种效果。。。这个命题应该不成立的,自相矛盾了……
发表于 2012-9-24 18:19:48 | 显示全部楼层
本帖最后由 CrLf 于 2012-9-24 18:21 编辑

回复 5# 每天几分


    不知我代码2生成的b.txt和楼主要求的结果有何不同呢?还是楼主没有试?
 楼主| 发表于 2012-9-24 18:42:33 | 显示全部楼层
回复 6# CrLf

试了啊……你自己看看
发表于 2012-9-24 18:55:00 | 显示全部楼层
本帖最后由 CrLf 于 2012-9-24 19:01 编辑

回复 7# 每天几分

    样本和实际文本格式不同,顶楼给出的样本似乎没有提到行首有空格?
    楼主的实际要求是先按拼音首字母排列,再对首字母相同项按长度排列,所以我原先的代码根据样本特征,只截取每行第一个字符和长度作为排序依据。
    代码已修改,测试无误

评分

参与人数 1技术 +1 收起 理由
每天几分 + 1 嗯,这代码对俺很有用!万分感谢!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 12:48 , Processed in 0.021932 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表