Board logo

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

作者: 3518228042    时间: 2017-6-25 12:32     标题: [已解决]如何实现将txt文本第一行中文数字转换阿拉伯数字后以文本第一行重命名文件

本帖最后由 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章
……
作者: happy886rr    时间: 2017-6-25 15:19

本帖最后由 happy886rr 于 2017-6-25 15:21 编辑

回复 1# 3518228042
你这个要求还蛮多的,请参考http://www.bathome.net/thread-44528-1-1.html 自己写吧。
作者: WHY    时间: 2017-6-28 00:26

本帖最后由 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. }
复制代码

作者: WHY    时间: 2017-6-28 13:55

  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
复制代码





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