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

[文本处理] [已解决]如何实现将txt文本第一行中文数字转换阿拉伯数字后以文本第一行重命名文件

[复制链接]
发表于 2017-6-25 12:32:44 | 显示全部楼层 |阅读模式
本帖最后由 3518228042 于 2017-6-29 10:30 编辑

多个TXT,每个文件一个章,第一行是章节名称,
如果第一行前面和后面有空格,都被清除掉空格,
如果第xx章后面有标题,则在第xx章和标题之间添加一个空格键的空格,
如果第xx章后面有标题,第xx章和标题之间有多个空格或大写空格,替换一个空格键的空格,
如果第xx章后面没有标题却多出个节字,删除节字,
如果第一行是空行或某行内容只有空格,则删除这一行,
如果最后一行没有换行则添加一个回车换行,有多个回车换行只保留一个回车换行,
另外一十五应该是十五,廿=二十,〇=0

将文本整理后,将第一行的大写转换为小写数字后(如果不足三位数补0),将第一行作为文件名重命名
  1. 第一章节哀顺变
  2. ……
  3. 第十一章   
  4. ……
  5.   第一十五章节
  6. ……
  7. 第廿九章 节外生枝
  8. ……
  9. 第两百〇一章
  10. ……
复制代码
第001章 节哀顺变
……
第011章
……
第015章
……
第029章 节外生枝
……
第201章
……
发表于 2017-6-25 15:19:30 | 显示全部楼层
本帖最后由 happy886rr 于 2017-6-25 15:21 编辑

回复 1# 3518228042
你这个要求还蛮多的,请参考http://www.bathome.net/thread-44528-1-1.html 自己写吧。
发表于 2017-6-28 00:26:56 | 显示全部楼层
本帖最后由 WHY 于 2017-6-28 13:51 编辑

“第十五章节哀顺变”中的“节”给误删掉了,改下
  1. @if (0)==(0) echo off
  2. dir /b *.txt | cscript //nologo //e:jscript "%~f0"
  3. pause & goto :EOF
  4. @end

  5. var str = '零一二三四五六七八九';
  6. var obj = {};
  7. for(var i=0; i<10; i++) obj[str.charAt(i)] = '+' + i;
  8. obj['〇'] = '+0'; obj['两'] = '+2'; obj['廿'] = '+20';
  9. obj['十'] = '*10'; obj['百'] = '*100'; obj['千'] = '*1000';

  10. var fso = new ActiveXObject('Scripting.FileSystemObject');
  11. var arr = WSH.StdIn.ReadAll().split('\r\n'), len = arr.length - 1;

  12. for(var i=0; i<len; i++){
  13.     var objFile = fso.OpenTextFile(arr[i]);
  14.     var txt = objFile.ReadAll() + '\r\n';
  15.     objFile.Close();
  16.     txt = txt.replace(/^[          ]*\r\n/gm, '');     //删除空白行
  17.     var m = txt.split('\r\n');
  18.     m[0] = convertToNumber(m[0]);                     //转换第一行数字
  19.     var objFile = fso.OpenTextFile(arr[i], 2);
  20.     objFile.Write(m.join('\r\n'));        //重新写入文本
  21.     objFile.Close();
  22.     if(!fso.FileExists(m[0] + '.txt'))fso.GetFile(arr[i]).Name = m[0] + '.txt' //重命名
  23. }

  24. function convertToNumber(s){
  25.     return s.replace(
  26.         /^[\s ]*第([零〇一二三四五六七八九两廿十百千]+)章(?:节|[\s ]*([^\s ]*))[\s ]*$/,
  27.         function(s0, s1, s2){
  28.             s1 = s1.replace(/./g, function(s0){return obj[s0]}); //转换数字
  29.             s1 = s1.replace(/^[*+]/, '');                        //删除字符串开头的*或+
  30.             s1 = (10000 + eval(s1) + '').substr(1);              //补零
  31.             return '第' + s1 + '章' + (s2 ? ' ' + s2 : '')
  32.         }
  33.     )
  34. }
复制代码

评分

参与人数 2技术 +2 收起 理由
老卡机 + 1 两都有用
3518228042 + 1 厉害,很详细

查看全部评分

发表于 2017-6-28 13:55:30 | 显示全部楼层
  1. Dim str, fso, file, f, txt, m

  2. str = "零一二三四五六七八九十百千"
  3. Set fso = CreateObject("Scripting.FileSystemObject")

  4. For Each file In fso.GetFolder(".").Files
  5.     If LCase(Right(file, 4)) = ".txt" Then
  6.         Set f = fso.OpenTextFile(file, 1)
  7.         txt = f.ReadAll + vbCrLf
  8.         f.Close
  9.         txt = DelBlankLine(txt)         '删除空白行
  10.         m = Split(txt, vbCrLf)
  11.         m(0) = ConvertToNumber(m(0))    '转换第一行数字
  12.         Set f = fso.OpenTextFile(file, 2)
  13.         f.Write Join(m, vbCrLf)         '重新写入文本
  14.         f.Close : Set f = Nothing
  15.         Rem 重命名
  16.         If Not fso.FileExists(m(0) + ".txt") Then fso.GetFile(file).Name = m(0) + ".txt"
  17.     End If
  18. Next

  19. Set fso = Nothing
  20. MsgBox "OK"

  21. function DelBlankLine(s)
  22.     Dim reg
  23.     Set reg = New RegExp
  24.     reg.Pattern = "^[          ]*\r\n"
  25.     reg.Global = True
  26.     reg.MultiLine = True
  27.     DelBlankLine = reg.Replace(s, "")
  28. End function

  29. Function ConvertToNumber(s)
  30.     Dim re, s1, s2, i, chr, ss
  31.     Set re = New RegExp
  32.     re.Pattern = "^[\s ]*第([" & str & "〇两廿]+)章(?:节|[\s ]*([^\s ]*))[\s ]*$"
  33.     If Not re.Test(s) Then ConvertToNumber = s : Exit Function

  34.     s1 = re.Execute(s)(0).SubMatches(0)
  35.     s2 = re.Execute(s)(0).SubMatches(1)

  36.     s1 = Replace(s1, "〇", "零") : s1 = Replace(s1, "两", "二") : s1 = Replace(s1, "廿", "二十")
  37.     If Left(s1, 1) = "十" Then s1 = "一" & s1
  38.     For i = 1 to Len(s1)
  39.         chr = Mid(s1, i, 1)
  40.         If InStr(str, chr) > 10 Then
  41.             ss = ss & "*10^" & (InStr(str, chr)-10) & "+"
  42.         Else
  43.             ss = ss & (InStr(str, chr)-1)
  44.         End If
  45.     Next
  46.     s1 = Right("0000" & eval(ss & "+0"), 4)
  47.     If s2 <> "" Then s2 = " " + s2

  48.     ConvertToNumber = "第" + s1 + "章" + s2
  49. End Function
复制代码

评分

参与人数 1技术 +1 收起 理由
3518228042 + 1 乐于助人

查看全部评分

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

本版积分规则

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

GMT+8, 2026-3-17 20:02 , Processed in 0.021573 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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