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

[文本处理] 时间文档与内容文档组合批处理

本帖最后由 lmq123 于 2023-4-19 16:00 编辑

有一个问题要解决就是再把时间文档与内容文档合并成一个整体,每个单元之间相隔一行,每个单元由一段数字+一段时间+一段长短不确定的中文英文数字等字符组成
时间文档是固定的每个小单元之间间隔一个空行,
但是内容文档是含有中文也含有英文数字的,而且它有2种情况,一种是每个小单元之间绝对是间隔一行的,另一种则是杂乱无章的数字与中英文字符之间是没有规律的,有可能之间隔一行,也可能是23456,,等任意空行,但是它们之间的间隔的空行数最大不会超过20行.
要把内容demo1与内容demo2分别与时间文档进行合并,当双击批处理后,能让内容1或内容2之中的任何一个与时间文档合并成合并后的样本那样子,批处理就算是成功了,不知道大家有什么好办法可以完成,求各位批处理高手献计解决一下,谢谢了


举例样本,这是需要合并的三个时间内容文档和一个合并成功后的样本,
链接:https://pan.baidu.com/s/1w-4IoXPpRg1F5e8cNJz5DA
提取码:hyu6

2楼、6楼代码作废,看看这样是不是符合你的需求:
  1. @echo off &@cls&chcp>nul 65001
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *时间*.srt') do findstr "." "%%i">temp
  4. for /f "delims=" %%a in ('dir /b /a-d *内容*.srt') do (
  5.     (for /f "delims=" %%i in ('type "%%a"') do (
  6.         set /p str=
  7.         set m=%%i
  8.         set /a n=m
  9.         if "!n!"=="%%i" (
  10.             echo,!n!
  11.         ) else if "!n!."=="%%i" (
  12.             echo,!n!
  13.         ) else (
  14.             echo,!str!
  15.             echo,%%i
  16.             echo,
  17.         )
  18.     ))<temp>Merge-%%a
  19. )
  20. del temp
  21. pause
复制代码

TOP

回复 11# lmq123
你描述的不清晰,我也没有仔细看,理解有误,代码与实际需求有出入,还是试试别人的答案吧。

TOP

代码中关键词自己修改为符合实际文件名
  1. @echo off&setlocal enabledelayedexpansion
  2. chcp 65001 >nul
  3. for /f "delims=" %%a in ('dir /b /a-d *内容*.srt *时间*.srt') do (
  4.      set /a n+=1,i=j=0
  5.      for /f "usebackq delims=" %%i in ("%%a") do (
  6.           set /a i=~i
  7.           if !i! equ 0 (
  8.              set "!n!.!j!=%%i"
  9.           ) else  set /a j+=1
  10.      )
  11. )
  12. (for /l %%i in (1,1,!j!) do (
  13.      echo;%%i
  14.      echo;!2.%%i!
  15.      echo;!1.%%i!
  16.      echo;
  17. ))>ttt.srt
  18. pause
复制代码
1

评分人数

    • 77七: 感谢分享,学到好多!技术 + 1

TOP

回复 10# qixiaobin0715


    我不会改代码,麻烦您帮我改一下吧,谢谢了,内容文档与时间文档名称是随机任意的

TOP

既然文件名不确定就用set /p。运行批处理后输入文件名及路径或拖入文件。

TOP

回复 2# qixiaobin0715


    你这个没有效果合并不了,不知道为什么,我时间与内容文档是任意名称的,只是时间文档名中含有时间2字,名称又可能有3~10个字之多,内容文档名称也是类似的规律

TOP

回复 7# newswan
这俩天下地干活了,还没测试,明天早上我去测试结果一下,公布效果如何

TOP

回复 6# qixiaobin0715


伸手党是这样, 就当自己练习了

TOP

本帖最后由 qixiaobin0715 于 2023-4-20 14:28 编辑

回复 1# lmq123
newswan看的很细致,这个都能发现。
现在有很多人,你写了代码来帮助他解决问题,代码是否有问题也不说一声,闷着。唉!
2楼代码写的匆忙,问题不止一个,比如变量延迟未开,newswan所说的编号非纯数字,有的后面带点号等等,如果还是按照2楼的思路,并且楼主的文件不再有别的意外出现,这样应当可以:
表示时间的文件为times.srt
表示对话的文件为demo.srt
  1. @echo off
  2. chcp 65001>nul
  3. findstr . times.srt>temp2
  4. findstr . demo.srt>temp1
  5. setlocal enabledelayedexpansion
  6. (for /f "delims=" %%i in (temp1) do (
  7.     set /p str=
  8.     set m=%%i
  9.     set /a n=m
  10.     if "!n!"=="%%i" (
  11.         echo,!n!
  12.     ) else if "!n!."=="%%i" (
  13.         echo,!n!
  14.     ) else (
  15.         echo,!str!
  16.         echo,%%i
  17.         echo,
  18.     )
  19. ))<temp2>Merge.srt
  20. del /f temp1 temp2
  21. pause
复制代码
注意:代码中用了两个临时文件,内容临时文件temp1一定要放在for循环in后的括号里,而时间临时文件temp2放在“<”后,因为这种方法不适合“代码页编号为65001”时,读取编码为UTF-8含有双字节字符的文本。
1

评分人数

    • 77七: ”注意:...文本。“ 学习了!技术 + 1

TOP

  1. function get_dic() {
  2. param(
  3. [string]$filename
  4. )
  5. $f1 = Get-Content -Encoding UTF8 $filename
  6. $f2 = $f1 -match "\S"
  7. $arr = [System.Collections.Specialized.OrderedDictionary]@{}
  8. $f2 | ForEach-Object -Begin { $i = 0 } {
  9. if ( $i -eq 0 ) {
  10. $i = $_ -replace "[.]+$",""
  11. }
  12. else {
  13. $arr.add( $i , $_ )
  14. $i = 0
  15. }
  16. }
  17. return $arr
  18. }
  19. $arrT = get_dic "4月10日时间.srt"
  20. $arrS = get_dic "4月10日内容demo1.srt"
  21. $srt = foreach ( $key in $arrT.keys ) {
  22. $key
  23. $arrT[$key]
  24. $arrS[$key]
  25. ""
  26. }
  27. $srt | Out-File -Encoding utf8 "4月10日.srt"
复制代码
demo 里面 有几个数字后面,多带了 一个 .
  1. 3.
复制代码

TOP

回复 3# newswan

把无关的东西删除,方便查看而已

TOP

以前做过合并分离双语字幕,但你这个字幕和时间分离是为什么?

TOP

批处理文件保存为UTF-8格式,未测试:
  1. @echo off
  2. chcp 65001>nul
  3. findstr . times.srt>temp1
  4. findstr . demo.srt>temp2
  5. (for /f "delims=" %%i in (temp1) do (
  6.     set /p str=
  7.     set /a n=%%i
  8.     if "!n!" equ "%%i" (
  9.         echo,%%i
  10.     ) else (
  11.         echo,%%i
  12.         echo,!str!
  13.         echo,
  14.     )
  15. ))<temp2>Merge.srt
  16. del /f temp1 temp2
  17. pause
复制代码

TOP

返回列表