标题: [文本处理] [已解决]如何实现将txt文本第一行中文数字转换阿拉伯数字后以文本第一行重命名文件 [打印本页]
作者: 3518228042 时间: 2017-6-25 12:32 标题: [已解决]如何实现将txt文本第一行中文数字转换阿拉伯数字后以文本第一行重命名文件
本帖最后由 3518228042 于 2017-6-29 10:30 编辑
多个TXT,每个文件一个章,第一行是章节名称,
如果第一行前面和后面有空格,都被清除掉空格,
如果第xx章后面有标题,则在第xx章和标题之间添加一个空格键的空格,
如果第xx章后面有标题,第xx章和标题之间有多个空格或大写空格,替换一个空格键的空格,
如果第xx章后面没有标题却多出个节字,删除节字,
如果第一行是空行或某行内容只有空格,则删除这一行,
如果最后一行没有换行则添加一个回车换行,有多个回车换行只保留一个回车换行,
另外一十五应该是十五,廿=二十,〇=0
将文本整理后,将第一行的大写转换为小写数字后(如果不足三位数补0),将第一行作为文件名重命名- 第一章节哀顺变
- ……
- 第十一章
- ……
- 第一十五章节
- ……
- 第廿九章 节外生枝
- ……
- 第两百〇一章
- ……
复制代码
第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 编辑
“第十五章节哀顺变”中的“节”给误删掉了,改下- @if (0)==(0) echo off
- dir /b *.txt | cscript //nologo //e:jscript "%~f0"
- pause & goto :EOF
- @end
-
- var str = '零一二三四五六七八九';
- var obj = {};
- for(var i=0; i<10; i++) obj[str.charAt(i)] = '+' + i;
- obj['〇'] = '+0'; obj['两'] = '+2'; obj['廿'] = '+20';
- obj['十'] = '*10'; obj['百'] = '*100'; obj['千'] = '*1000';
-
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var arr = WSH.StdIn.ReadAll().split('\r\n'), len = arr.length - 1;
-
- for(var i=0; i<len; i++){
- var objFile = fso.OpenTextFile(arr[i]);
- var txt = objFile.ReadAll() + '\r\n';
- objFile.Close();
- txt = txt.replace(/^[ ]*\r\n/gm, ''); //删除空白行
- var m = txt.split('\r\n');
- m[0] = convertToNumber(m[0]); //转换第一行数字
- var objFile = fso.OpenTextFile(arr[i], 2);
- objFile.Write(m.join('\r\n')); //重新写入文本
- objFile.Close();
- if(!fso.FileExists(m[0] + '.txt'))fso.GetFile(arr[i]).Name = m[0] + '.txt' //重命名
- }
-
- function convertToNumber(s){
- return s.replace(
- /^[\s ]*第([零〇一二三四五六七八九两廿十百千]+)章(?:节|[\s ]*([^\s ]*))[\s ]*$/,
- function(s0, s1, s2){
- s1 = s1.replace(/./g, function(s0){return obj[s0]}); //转换数字
- s1 = s1.replace(/^[*+]/, ''); //删除字符串开头的*或+
- s1 = (10000 + eval(s1) + '').substr(1); //补零
- return '第' + s1 + '章' + (s2 ? ' ' + s2 : '')
- }
- )
- }
复制代码
作者: WHY 时间: 2017-6-28 13:55
- Dim str, fso, file, f, txt, m
-
- str = "零一二三四五六七八九十百千"
- Set fso = CreateObject("Scripting.FileSystemObject")
-
- For Each file In fso.GetFolder(".").Files
- If LCase(Right(file, 4)) = ".txt" Then
- Set f = fso.OpenTextFile(file, 1)
- txt = f.ReadAll + vbCrLf
- f.Close
- txt = DelBlankLine(txt) '删除空白行
- m = Split(txt, vbCrLf)
- m(0) = ConvertToNumber(m(0)) '转换第一行数字
- Set f = fso.OpenTextFile(file, 2)
- f.Write Join(m, vbCrLf) '重新写入文本
- f.Close : Set f = Nothing
- Rem 重命名
- If Not fso.FileExists(m(0) + ".txt") Then fso.GetFile(file).Name = m(0) + ".txt"
- End If
- Next
-
- Set fso = Nothing
- MsgBox "OK"
-
- function DelBlankLine(s)
- Dim reg
- Set reg = New RegExp
- reg.Pattern = "^[ ]*\r\n"
- reg.Global = True
- reg.MultiLine = True
- DelBlankLine = reg.Replace(s, "")
- End function
-
- Function ConvertToNumber(s)
- Dim re, s1, s2, i, chr, ss
- Set re = New RegExp
- re.Pattern = "^[\s ]*第([" & str & "〇两廿]+)章(?:节|[\s ]*([^\s ]*))[\s ]*$"
- If Not re.Test(s) Then ConvertToNumber = s : Exit Function
-
- s1 = re.Execute(s)(0).SubMatches(0)
- s2 = re.Execute(s)(0).SubMatches(1)
-
- s1 = Replace(s1, "〇", "零") : s1 = Replace(s1, "两", "二") : s1 = Replace(s1, "廿", "二十")
- If Left(s1, 1) = "十" Then s1 = "一" & s1
- For i = 1 to Len(s1)
- chr = Mid(s1, i, 1)
- If InStr(str, chr) > 10 Then
- ss = ss & "*10^" & (InStr(str, chr)-10) & "+"
- Else
- ss = ss & (InStr(str, chr)-1)
- End If
- Next
- s1 = Right("0000" & eval(ss & "+0"), 4)
- If s2 <> "" Then s2 = " " + s2
-
- ConvertToNumber = "第" + s1 + "章" + s2
- End Function
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |