标题: [文本处理] 批处理怎样将txt文本中时间的年份统一加上一个数字返回? [打印本页]
作者: Wedy 时间: 2019-5-10 16:10 标题: 批处理怎样将txt文本中时间的年份统一加上一个数字返回?
请教一个批处理代码,一个文件下有多个的txt文本,文本中大致格式如下
1122960100={
name="纪"
dynasty=1122960000#逄
culture="han"
religion="shiite"
intrigue=16
trait=patient
160.1.1={
birth="160.1.1"
}
176.1.1={
name="纪(元图)"
}
202.8.1={
death="202.8.1"
}
}
需要实现的是将里面的日期中的年份全部加上2697,即换成皇帝纪元,请问怎样批次处理,小白,懵逼。- @echo off
- rem 进入批处理文件所在的路径
- cd D:\111
- echo ***** 替换时间中的年份+2567 *****
- rem 定义要替换的新旧字符串
- rem 定义变量修改本地化延期
- setlocal enabledelayedexpansion
- rem 循环取出要处理的文件名
- for /f "tokens=*" %%i in ('dir D:\111\*.txt /b') do (
- set "var=%%i"
- if not !var!.==. (
- rem 单个文件一行行处理,将旧字段替换成新字段
- for /f "tokens=*" %%j in (!var!) do (
- #时间正则:
- echo %%j^|findstr /i "[-]{0,1}[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}" >nul 2>nul
- if !errorlevel! equ 0 (
- set /a m=j+2657
- rem 将处理后的每一行记录追加到temp.txt文件中
- echo !m!>>temp.txt
- )
- )
- rem 在单个文件的每一行经过替换操作后,将处理后的文本从temp.txt临时文件剪贴到目标处理文件中(剪贴后临时文件会自动删除)
- move temp.txt !var!
- )
- )
- pause
复制代码
我这纯粹是搜一些网上的用法东拼西凑 不行。。。
理想实现的是:
将文件下的所有txt文本中的年份统一改成皇帝纪元的算法,最好还可以备份原txt,更名为XX_back.txt
,大佬们,可以帮帮小白不? 拜上
作者: zaqmlp 时间: 2019-5-10 16:47
本帖最后由 zaqmlp 于 2019-5-10 16:53 编辑
哪个是日期中的年份呀,有什么特征呀
作者: Wedy 时间: 2019-5-10 18:16
本帖最后由 Wedy 于 2019-5-10 18:58 编辑
就单纯的年份啊,比如出生的年份,加冕年份,死亡的年份,但不包含后面的月日
作者: Batcher 时间: 2019-5-10 18:57
回复 3# Wedy
在你给的这段样本数据里面哪几位数字表示年份?
作者: Wedy 时间: 2019-5-10 18:58
本帖最后由 Wedy 于 2019-5-10 19:02 编辑
回复 4# Batcher 160年,176年,202年
就是上面那个人物的信息,一般有出生时间,加冕时间,死亡时间,中间可能有其他的时间,反正就是统一换算成黄帝纪元,就是把他的年份统一改成加上2697后算出来的新年份
作者: zaqmlp 时间: 2019-5-10 19:24
本帖最后由 zaqmlp 于 2019-5-10 21:57 编辑
- @echo off
- set info=互助互利,支付宝扫码头像,感谢赞助
- rem 有问题,可加QQ956535081及时沟通
- title %info%
- cd /d "%~dp0"
- set "output=结果"
- md "%output%" 2>nul
- powershell -NoProfile -ExecutionPolicy bypass ^
- $files=@(dir *.txt^|?{$_ -is [System.IO.FileInfo]});^
- for($i=0;$i -lt $files.length;$i++){^
- write-host $files[$i].Name;^
- $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
- $newtext=[regex]::replace($text,'-?\d+(?=\.\d+\.\d+)',{param($a);[int]$a.value+2697;});^
- [IO.File]::WriteAllText(('%output%\'+$files[$i].Name), $newtext, [Text.Encoding]::UTF8);^
- };^
- write-host '%info%' -ForegroundColor green;
- pause
复制代码
作者: Batcher 时间: 2019-5-10 19:28
回复 5# Wedy - @echo off
- setlocal enabledelayedexpansion
- set "NewFolder=处理结果"
- if not exist "%NewFolder%" (
- md "%NewFolder%"
- )
- for %%x in (*.txt) do (
- (for /f "tokens=1* delims==" %%a in ('type "%%x"') do (
- set "RawKey=%%a"
- set "TrimKey=!RawKey: =!"
- if "!TrimKey!" equ "birth" (
- call :ChangeYear "%%~a" "%%~b"
- ) else if "!TrimKey!" equ "death" (
- call :ChangeYear "%%~a" "%%~b"
- ) else if "x%%b" neq "x" (
- echo %%a=%%b
- ) else (
- echo %%a
- )
- ))>"%NewFolder%\%%x.txt"
- )
- goto :eof
-
- :ChangeYear
- for /f "tokens=1* delims=." %%h in ("%~2") do (
- set /a CalcYear=%%h+2697
- echo %~1="!CalcYear!.%%i"
- )
- goto :eof
复制代码
作者: Wedy 时间: 2019-5-10 20:19
本帖最后由 Wedy 于 2019-5-10 20:37 编辑
回复 7# Batcher
谢谢管理员。。我这个是在说一个游戏,想加点自己玩的东西。因为加的文件个数很多,不批量很费时,所以想省事来学习一下。
上面那个大佬的用了没反应,你给的可以生成文件夹打开后中文乱码了(我换成asc编码才行,但是游戏文件需要时那种格式--utf8?EdiitPlus显示的Unix)
也不完全是我想要的效果
我的意思是原本是这样的
1150260100={
name="操"
dynasty=1150260000#曹
culture="han"
religion="shiite"
father=1150260090
155.7.18={
birth="155.7.18"
}
155.7.18={
name="吉利(阿瞒)"
}
171.7.18={
name="操(孟德)"
}
171.2.8={
add_spouse=1150260101 #配偶刘氏
}
172.4.12={
add_spouse=1150260102 #配偶丁氏
}
186.1.1={
add_spouse=1150860100#配偶卞氏
}
194.10.1={
effect={
#其他事情2
}
}
220.3.15={
death="220.3.15"
}
}
修改后应该是这样的
1150260100={
name="操"
dynasty=1150260000#曹
culture="han"
religion="shiite"
father=1150260090
2852.7.18={
birth="2852.7.18"
}
2852.7.18={
name="吉利(阿瞒)"
}
2868.7.18={
name="操(孟德)"
}
2868.2.8={
add_spouse=1150260101 #配偶刘氏
}
2869.4.12={
add_spouse=1150260102 #配偶丁氏
}
2883.1.1={
add_spouse=1150860100 #配偶卞氏
}
2886.10.1={
effect={
#其他事情1
}
}
2891.10.1={
effect={
#其他事情2
}
}
2917.3.15={
death="2917.3.15"
}
}
就是涉及到时间年份的都改成黄帝纪元的算法
嗯,补充一点,就是只要是时间格式的年份都这么处理,可以吗,因为这个只是人物的时间格式
在其他文件中就是这样的格式了
25.8.5={
holder=1102520950 #汉光武帝(刘秀)-17-1
name=" 汉 "
adjective=" 大汉的 "
}
57.3.29={
holder=1102521050 #汉明帝(刘庄)-18-2
}
75.9.5={
holder=1102521150 #汉章帝(刘炟)-19-3
}
88.4.9={
holder=1102521200 #汉和帝(刘肇)-20-4
}
106.2.13={
holder=1102521300 #汉殇帝(刘隆)-21-5
}
所以我最初就是想问的改所有时间格式年份的地方为皇帝纪元的写法
方便在改改吗,谢谢
作者: Batcher 时间: 2019-5-10 21:08
回复 8# Wedy
编码问题稍后再说,先试试能否处理人物的时间格式:- @echo off
- setlocal enabledelayedexpansion
- set "NewFolder=处理结果"
- if not exist "%NewFolder%" (
- md "%NewFolder%"
- )
- for %%x in (*.txt) do (
- (for /f "tokens=1* delims==" %%a in ('type "%%x"') do (
- set "RawKey=%%a"
- set "TrimKey=!RawKey: =!"
- if "%%b" equ "{" (
- for /f "tokens=1* delims=." %%e in ("%%a") do (
- if "x%%f" neq "x" (
- call :ChangeKey %%a
- ) else (
- echo %%a=%%b
- )
- )
- ) else if "!TrimKey!" equ "birth" (
- call :ChangeValue "%%~a" "%%~b"
- ) else if "!TrimKey!" equ "death" (
- call :ChangeValue "%%~a" "%%~b"
- ) else if "x%%b" neq "x" (
- echo %%a=%%b
- ) else (
- echo %%a
- )
- ))>"%NewFolder%\%%x"
- )
- goto :eof
-
- :ChangeKey
- for /f "tokens=1* delims=." %%h in ("%~1") do (
- set /a CalcYear=%%h+2697
- echo !CalcYear!.%%i={
- )
- goto :eof
-
- :ChangeValue
- for /f "tokens=1* delims=." %%h in ("%~2") do (
- set /a CalcYear=%%h+2697
- echo %~1="!CalcYear!.%%i"
- )
- goto :eof
复制代码
作者: Wedy 时间: 2019-5-10 21:26
回复 9# Batcher
牛牛牛!!!管理厉害,公元前的都处理了,就是格式和编码错乱了
############ 1代-第一任 -202.2.1 #############
1102520100={
name="季"
dynasty=1102520000#刘
culture="han"
religion="shiite"
martial=12
diplomacy=40
intrigue=16
stewardship=8
learning=8
trait=underhanded_rogue
trait=patient
trait=hedonist
trait=ambitious
-257.1.6={
birth="-257.1.6"
}
-241.1.6={
name="邦"
}
-207.10.1={
name="汉王(刘邦)"
}
-202.2.1={
name="汉高祖(刘邦)"
}
-202.2.1={
#汉高祖血脉
create_bloodline={
type=bloodlines_LiuBang
has_dlc="Holy Fury"
}
}
-195.6.1={
death="-195.6.1"
}
}
############ 1浠?绗竴浠?-202.2.1 #############
1102520100={
name="瀛?
dynasty=1102520000#鍒? culture="han"
religion="shiite"
martial=12
diplomacy=40
intrigue=16
stewardship=8
learning=8
trait=underhanded_rogue
trait=patient
trait=hedonist
trait=ambitious
2440.1.6={
birth="2440.1.6"
}
2456.1.6={
name="閭?
}
2490.10.1={
name="姹夌帇锛堝垬閭︼級"
}
2495.2.1={
name="姹夐珮绁栵紙鍒橀偊锛?
}
2495.2.1={
#姹夐珮绁栬鑴? create_bloodline={
type=bloodlines_LiuBang
has_dlc="Holy Fury"
}
}
2502.6.1={
death="2502.6.1"
}
}
作者: Batcher 时间: 2019-5-10 21:33
回复 10# Wedy
你先试试手工把原始文件转成ANSI编码格式,再执行批处理,还会出现这个乱码问题吗?
作者: Wedy 时间: 2019-5-10 21:45
回复 10# Wedy
我拿去试了另一个,因为有2600个文件,有点慢,发现这里应该真是编码的原因,第一行会转化失败,多出一个其他字符【锘?】
编码有神么好的解决方式吗
-202.2.1={ liege=e_china }
-202.2.1={
law=agnatic_succession
law=succ_primogeniture
law=feudal_crown_law_3
law=investiture_law_1
}
############# 西汉 #############
-202.2.1={
holder=1102520100 #汉高祖(刘邦)-1
}
-195.6.1={
holder=1102520200 #汉惠帝(刘盈)-2
}
-188.9.26={
holder=1102520300 #汉少帝(刘恭)-3
}
锘?
-202.2.1={ liege=e_china }
2495.2.1={
law=agnatic_succession
law=succ_primogeniture
law=feudal_crown_law_3
law=investiture_law_1
}
############# 瑗挎眽 #############
2495.2.1={
holder=1102520100 #姹夐珮绁?鍒橀偊)-1
}
2502.6.1={
holder=1102520200 #姹夋儬甯?鍒樼泩)-2
}
2509.9.26={
holder=1102520300 #姹夊皯甯?鍒樻伃)-3
}
作者: Wedy 时间: 2019-5-10 21:51
回复 10# Wedy
我改了两个文件测试发现没有乱码,但是文件的格式有错乱,第一个时间没改成时间
-202.2.1={ liege=e_china }
-202.2.1={
law=agnatic_succession
law=succ_primogeniture
law=feudal_crown_law_3
law=investiture_law_1
}
############# 西汉 #############
-202.2.1={
holder=1102520100 #汉高祖(刘邦)-1
}
-195.6.1={
holder=1102520200 #汉惠帝(刘盈)-2
}
-202.2.1={ liege=e_china }
2495.2.1={
law=agnatic_succession
law=succ_primogeniture
law=feudal_crown_law_3
law=investiture_law_1
}
############# 西汉 #############
2495.2.1={
holder=1102520100 #汉高祖(刘邦)-1
}
2502.6.1={
holder=1102520200 #汉惠帝(刘盈)-2
}
作者: Wedy 时间: 2019-5-10 22:04
回复 11# Batcher
管理员大佬,我看了一下,编码问题我会自己去处理,主要是这个计算,因为一个文件一个文件打开取换时间肯定不科学,而且很可能算错,我发现的有3个问题:
1.以-号开头的似乎有些无效尤其是在文件开始的地方;2公元1年的时间貌似都没转成功(我来问之前特别去看了下正则表达式"[-]{0,1}[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}",不知道这个不能用在批处理中吗?找到符合条件的,然后转成数字,加上2697,我个人认为是这个逻辑);3就是转换的部分地方格式乱了
作者: Wedy 时间: 2019-5-10 23:02
回复 11# Batcher
打搅了,谢谢管理了,至少让绝大部分的年份不用自己去算了。晚安
作者: Batcher 时间: 2019-5-10 23:15
回复 13# Wedy - @echo off
- setlocal enabledelayedexpansion
- set "NewFolder=处理结果"
- if not exist "%NewFolder%" (
- md "%NewFolder%"
- )
- for %%x in (*.txt) do (
- (for /f "tokens=1* delims==" %%a in ('type "%%x"') do (
- set "RawKey=%%a"
- set "TrimKey=!RawKey: =!"
- set "CheckCurly=%%b"
- if "!CheckCurly:~0,1!" equ "{" (
- for /f "tokens=1* delims=." %%e in ("%%a") do (
- if "x%%f" neq "x" (
- call :ChangeKey "%%a" "%%b"
- ) else (
- echo %%a=%%b
- )
- )
- ) else if "!TrimKey!" equ "birth" (
- call :ChangeValue "%%~a" "%%~b"
- ) else if "!TrimKey!" equ "death" (
- call :ChangeValue "%%~a" "%%~b"
- ) else if "x%%b" neq "x" (
- echo %%a=%%b
- ) else (
- echo %%a
- )
- ))>"%NewFolder%\%%x"
- )
- goto :eof
-
- :ChangeKey
- for /f "tokens=1* delims=." %%h in ("%~1") do (
- set /a CalcYear=%%h+2697
- echo !CalcYear!.%%i=%~2
- )
- goto :eof
-
- :ChangeValue
- for /f "tokens=1* delims=." %%h in ("%~2") do (
- set /a CalcYear=%%h+2697
- echo %~1="!CalcYear!.%%i"
- )
- goto :eof
复制代码
作者: Batcher 时间: 2019-5-10 23:18
回复 14# Wedy
你给个测试用例,我试试看。
(我来问之前特别去看了下正则表达式"[-]{0,1}[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}",不知道这个不能用在批处理中吗?
findstr命令不支持这种复杂的正则,需要引入第三方命令才行。
作者: Wedy 时间: 2019-5-11 00:20
这个只是随便从文件中搞了几个有人物也有头衔的,我试了你新给的,有一个500+Kb人物文本那里矿口提示云幸福不存在,这个有上传限制,我给不了大文本。不知道是不是这个文件中有什么关键字之类的让bat命令停止了。格式有点问题(会把时间空一格出来,是因为公元前-号的原因?强迫症对不整齐感觉不舒服)。类似头衔以1.1.1日的时间没有被转,包括改成了180年之类的也无效管理方便就看,不方便就算了。我主要是不想对每一个年份进行计算,毕竟那个容易出错,有些许地方有问题,是可以接受的,发现了就改,没发现就算了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |