[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理怎样将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,即换成皇帝纪元,请问怎样批次处理,小白,懵逼。
  1. @echo off
  2. rem 进入批处理文件所在的路径
  3. cd D:\111
  4. echo ***** 替换时间中的年份+2567 *****
  5. rem 定义要替换的新旧字符串
  6. rem 定义变量修改本地化延期
  7. setlocal enabledelayedexpansion
  8. rem 循环取出要处理的文件名
  9. for /f "tokens=*" %%i in ('dir D:\111\*.txt /b') do (
  10.     set "var=%%i"
  11.     if not !var!.==. (
  12. rem 单个文件一行行处理,将旧字段替换成新字段
  13. for /f "tokens=*" %%j in (!var!) do (
  14.                     #时间正则:
  15.     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
  16.     if !errorlevel! equ 0 (
  17.       set /a m=j+2657
  18. rem 将处理后的每一行记录追加到temp.txt文件中
  19.       echo !m!>>temp.txt
  20.     )
  21. )
  22. rem 在单个文件的每一行经过替换操作后,将处理后的文本从temp.txt临时文件剪贴到目标处理文件中(剪贴后临时文件会自动删除)
  23. move temp.txt !var!
  24.     )
  25. )
  26. pause
复制代码
我这纯粹是搜一些网上的用法东拼西凑 不行。。。
理想实现的是:
将文件下的所有txt文本中的年份统一改成皇帝纪元的算法,最好还可以备份原txt,更名为XX_back.txt
,大佬们,可以帮帮小白不? 拜上

本帖最后由 zaqmlp 于 2019-5-10 16:53 编辑

哪个是日期中的年份呀,有什么特征呀
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

本帖最后由 Wedy 于 2019-5-10 18:58 编辑

就单纯的年份啊,比如出生的年份,加冕年份,死亡的年份,但不包含后面的月日

TOP

回复 3# Wedy


    在你给的这段样本数据里面哪几位数字表示年份?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 Wedy 于 2019-5-10 19:02 编辑

回复 4# Batcher 160年,176年,202年
就是上面那个人物的信息,一般有出生时间,加冕时间,死亡时间,中间可能有其他的时间,反正就是统一换算成黄帝纪元,就是把他的年份统一改成加上2697后算出来的新年份

TOP

本帖最后由 zaqmlp 于 2019-5-10 21:57 编辑
  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. cd /d "%~dp0"
  6. set "output=结果"
  7. md "%output%" 2>nul
  8. powershell -NoProfile -ExecutionPolicy bypass ^
  9.     $files=@(dir *.txt^|?{$_ -is [System.IO.FileInfo]});^
  10.     for($i=0;$i -lt $files.length;$i++){^
  11.         write-host $files[$i].Name;^
  12.         $text=[IO.File]::ReadAllText($files[$i].FullName, [Text.Encoding]::UTF8);^
  13.         $newtext=[regex]::replace($text,'-?\d+(?=\.\d+\.\d+)',{param($a);[int]$a.value+2697;});^
  14.         [IO.File]::WriteAllText(('%output%\'+$files[$i].Name), $newtext, [Text.Encoding]::UTF8);^
  15.     };^
  16.     write-host '%info%' -ForegroundColor green;
  17. pause
复制代码
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

回复 5# Wedy
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "NewFolder=处理结果"
  4. if not exist "%NewFolder%" (
  5.     md "%NewFolder%"
  6. )
  7. for %%x in (*.txt) do (
  8.     (for /f "tokens=1* delims==" %%a in ('type "%%x"') do (
  9.         set "RawKey=%%a"
  10.         set "TrimKey=!RawKey: =!"
  11.         if "!TrimKey!" equ "birth" (
  12.             call :ChangeYear "%%~a" "%%~b"
  13.         ) else if "!TrimKey!" equ "death" (
  14.             call :ChangeYear "%%~a" "%%~b"
  15.         ) else if "x%%b" neq "x" (
  16.             echo %%a=%%b
  17.         ) else (
  18.             echo %%a
  19.         )
  20.     ))>"%NewFolder%\%%x.txt"
  21. )
  22. goto :eof
  23. :ChangeYear
  24. for /f "tokens=1* delims=." %%h in ("%~2") do (
  25.     set /a CalcYear=%%h+2697
  26.     echo %~1="!CalcYear!.%%i"
  27. )
  28. goto :eof
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 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
}
所以我最初就是想问的改所有时间格式年份的地方为皇帝纪元的写法
方便在改改吗,谢谢

TOP

回复 8# Wedy


编码问题稍后再说,先试试能否处理人物的时间格式:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "NewFolder=处理结果"
  4. if not exist "%NewFolder%" (
  5.     md "%NewFolder%"
  6. )
  7. for %%x in (*.txt) do (
  8.     (for /f "tokens=1* delims==" %%a in ('type "%%x"') do (
  9.         set "RawKey=%%a"
  10.         set "TrimKey=!RawKey: =!"
  11.         if "%%b" equ "{" (
  12.             for /f "tokens=1* delims=." %%e in ("%%a") do (
  13.                 if "x%%f" neq "x" (
  14.                     call :ChangeKey %%a
  15.                 ) else (
  16.                     echo %%a=%%b
  17.                 )
  18.             )
  19.         ) else if "!TrimKey!" equ "birth" (
  20.             call :ChangeValue "%%~a" "%%~b"
  21.         ) else if "!TrimKey!" equ "death" (
  22.             call :ChangeValue "%%~a" "%%~b"
  23.         ) else if "x%%b" neq "x" (
  24.             echo %%a=%%b
  25.         ) else (
  26.             echo %%a
  27.         )
  28.     ))>"%NewFolder%\%%x"
  29. )
  30. goto :eof
  31. :ChangeKey
  32. for /f "tokens=1* delims=." %%h in ("%~1") do (
  33.     set /a CalcYear=%%h+2697
  34.     echo   !CalcYear!.%%i={
  35. )
  36. goto :eof
  37. :ChangeValue
  38. for /f "tokens=1* delims=." %%h in ("%~2") do (
  39.     set /a CalcYear=%%h+2697
  40.     echo %~1="!CalcYear!.%%i"
  41. )
  42. goto :eof
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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"
  }
}

TOP

回复 10# Wedy


    你先试试手工把原始文件转成ANSI编码格式,再执行批处理,还会出现这个乱码问题吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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
}

TOP

回复 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
}

TOP

回复 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就是转换的部分地方格式乱了

TOP

回复 11# Batcher
打搅了,谢谢管理了,至少让绝大部分的年份不用自己去算了。晚安

TOP

返回列表