找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 85732|回复: 17

[文本处理] 求BAT批量合并中英文字幕的批处理文件

[复制链接]
发表于 2018-9-14 11:31:36 | 显示全部楼层 |阅读模式
在网上下载了英文视频MP4格式及纯英文字幕en.srt.用字幕软件翻译保存成纯中文zh-cn.srt

求P处理文件。求批量合并成中英文字幕chs-en.srt,并删除单独的字幕
发表于 2018-9-14 11:49:14 | 显示全部楼层
在网上下载了英文视频MP4格式及字幕en.srt.用字幕出来软件翻译保存成zh-cn.srt

求P处理文件。求批量合并 ...
badboy2 发表于 2018-9-14 11:31



    问题描述不清,是删除英文字幕还是中文字幕,合并是英文字幕后追加中文字幕?
 楼主| 发表于 2018-9-14 11:52:39 | 显示全部楼层
回复 2# xinxing124
就是批量合并成带中英文的新字幕,然后删除其它两个纯英文、中文的字幕
发表于 2018-9-14 12:44:54 | 显示全部楼层
把en.srt和zh-cn.srt打包压缩传上来看看
 楼主| 发表于 2018-9-14 14:04:55 | 显示全部楼层
本帖最后由 badboy2 于 2018-9-14 14:10 编辑

回复 4# Batcher
已打包。。大大帮忙看看。合成效果如01 Welcome.chs-en.srt,我需要的是批量合并功能。。


en.srt是纯英文字幕,zh-cn.srt是纯中文字幕,想批处理能把文件夹里面的所有这两类字幕合并成中英chs-en字幕,合并成功后自动删除文件夹内的纯英及纯中字幕,并且不影响同名的后缀MP4视频文件(视频文件太大打不上去)。
发表于 2018-9-14 15:55:20 | 显示全部楼层
---------------------------
错误
---------------------------
C:\Downloads\1 - Introduction.rar
这个压缩文件格式未知或者数据已经被损坏
---------------------------
确定   
---------------------------
发表于 2018-9-14 22:29:55 | 显示全部楼层
  1. @if(0)==(0) echo off
  2. dir /b *zh-cn.srt | cscript //nologo //e:jscript "%~f0"
  3. pause & goto :EOF
  4. @end

  5. var fso = new ActiveXObject('Scripting.FileSystemObject');
  6. var reg = /^(\d\d:\d\d:\d\d,\d+)[^\r\n]+(\r?\n[^\r\n]+)/gm;

  7. while(!WSH.StdIn.AtEndOfStream) {
  8.     var map = [];
  9.     var cnFile = WSH.StdIn.ReadLine();
  10.     var enFile = cnFile.replace(/zh-cn\.srt$/i, 'en.srt');
  11.     if(!fso.FileExists(enFile)) continue;

  12.     var cnStr = getText(cnFile);
  13.     var enStr = getText(enFile);

  14.     while(arr=reg.exec(enStr)) map[arr[1]] = arr[2];
  15.     var s = cnStr.replace(
  16.         /^(\d\d:\d\d:\d\d,\d+)[^\r\n]+\r?\n[^\r\n]+/gm,
  17.         function(s0, s1) { return s0  + map[s1]; }
  18.     )

  19.     var file = cnFile.replace(/zh-cn\.srt$/i, 'chs-en.srt');
  20.     writeToFile(s, file);

  21.     //fso.DeleteFile(cnFile);
  22.     //fso.DeleteFile(enFile);
  23. }

  24. function getText(file) {
  25.     with(new ActiveXObject('ADODB.Stream')){
  26.         Mode = 3; Type = 2;
  27.         Charset = 'utf-8';
  28.         Open();
  29.         LoadFromFile(file);
  30.         var s = ReadText(-1);
  31.     }
  32.     return s;
  33. }

  34. function writeToFile(s, file) {
  35.     with(new ActiveXObject('ADODB.Stream')){
  36.         Mode = 3; Type = 2;
  37.         Charset = 'utf-8';
  38.         Open();
  39.         WriteText(s);
  40.         SaveToFile(file, 2);
  41.     }
  42. }
复制代码

评分

参与人数 1技术 +1 收起 理由
badboy2 + 1 完美解决我问题

查看全部评分

 楼主| 发表于 2018-9-15 13:39:25 | 显示全部楼层
本帖最后由 badboy2 于 2018-9-15 13:44 编辑

回复 7# WHY

高手啊。解决了我的问题。受累能否在加点命令,合并后把原en.srt及zh-cn.srt的文件删除掉?
 楼主| 发表于 2018-9-15 14:01:41 | 显示全部楼层
回复 6# 523066680
可能是我用了winRAR 5.6高版本的原因,低版本的有可能打不开
发表于 2018-9-15 14:08:07 | 显示全部楼层
回复 9# badboy2


    接着我就卸载了旧版安装了新的个人免费版,压缩包可以打开了。
并弹出了新版winrar的“中秋买螃蟹送礼”广告,大概有 800x600这么大。

找了个 WinRar 5.10 EAT 破解版 (英文),界面和旧版界面一样,能打开新版压缩包。

7-zip 最新版可以打开,我可以放心地使用开源软件了~

之前有个题主问过类似的问题:
http://bbs.bathome.net/thread-47221-1-1.html
发表于 2018-9-15 16:45:15 | 显示全部楼层
Perl版
  1. use File::Slurp;
  2. STDOUT->autoflush(1);

  3. my %name;
  4. grep { s/\..+$//; $name{$_} = 1 } glob "*.srt";
  5. grep { merge( $_ ); } sort keys %name;

  6. sub merge
  7. {
  8.     my $name = shift;
  9.     my @zh = read_file( $name .".zh-cn.srt" );
  10.     my @en = read_file( $name .".en.srt" );
  11.     printf "%s\n", $name;

  12.     for my $id ( 0 .. $#en ) {
  13.         $en[$id] .= $zh[$id+1] if ( $en[$id] =~ /\d+:\d+:\d+.*\d+:\d+:\d+/ );
  14.     }
  15.     write_file( "${name}.chs-en.srt", @en );
  16. }
复制代码

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 1

查看全部评分

 楼主| 发表于 2018-9-15 17:14:09 | 显示全部楼层
本帖最后由 badboy2 于 2018-9-15 17:22 编辑

回复 1# badboy2
文件夹里只想保留合并后的chs-en.srt及同名原mp4文件,但是所有的原en.srt及zh-cn.srt还在(未被删除),劳烦再补充下代码,再次感谢!
 楼主| 发表于 2018-9-15 17:19:05 | 显示全部楼层
回复 10# 523066680
官方有无广告的winRaR版本下载地址,百度下加个key就可以用了
发表于 2018-9-15 18:29:13 | 显示全部楼层
回复 12# badboy2

WHY已经在代码里写了删除的部分,但是临时屏蔽了(谨慎起见),可惜有人不看代码
  1.     //fso.DeleteFile(cnFile);
  2.     //fso.DeleteFile(enFile);
复制代码
把 // 去掉就会执行删除操作,第27,28行。
 楼主| 发表于 2018-9-15 19:40:10 | 显示全部楼层
回复 14# 523066680
谢谢指点,看字面也猜到这两行,无奈真的是门外汉,时间紧,唯有先请教高手们了,也谢谢写这段代码的朋友,慢慢学习理解中!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 01:21 , Processed in 0.034971 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表