标题: [文本处理] 时间文档与内容文档组合批处理 [打印本页]
作者: lmq123 时间: 2023-4-19 15:59 标题: 时间文档与内容文档组合批处理
本帖最后由 lmq123 于 2023-4-19 16:00 编辑
有一个问题要解决就是再把时间文档与内容文档合并成一个整体,每个单元之间相隔一行,每个单元由一段数字+一段时间+一段长短不确定的中文英文数字等字符组成
时间文档是固定的每个小单元之间间隔一个空行,
但是内容文档是含有中文也含有英文数字的,而且它有2种情况,一种是每个小单元之间绝对是间隔一行的,另一种则是杂乱无章的数字与中英文字符之间是没有规律的,有可能之间隔一行,也可能是23456,,等任意空行,但是它们之间的间隔的空行数最大不会超过20行.
要把内容demo1与内容demo2分别与时间文档进行合并,当双击批处理后,能让内容1或内容2之中的任何一个与时间文档合并成合并后的样本那样子,批处理就算是成功了,不知道大家有什么好办法可以完成,求各位批处理高手献计解决一下,谢谢了
举例样本,这是需要合并的三个时间内容文档和一个合并成功后的样本,
链接:https://pan.baidu.com/s/1w-4IoXPpRg1F5e8cNJz5DA
提取码:hyu6
作者: qixiaobin0715 时间: 2023-4-19 16:47
批处理文件保存为UTF-8格式,未测试:- @echo off
- chcp 65001>nul
- findstr . times.srt>temp1
- findstr . demo.srt>temp2
- (for /f "delims=" %%i in (temp1) do (
- set /p str=
- set /a n=%%i
- if "!n!" equ "%%i" (
- echo,%%i
- ) else (
- echo,%%i
- echo,!str!
- echo,
- )
- ))<temp2>Merge.srt
- del /f temp1 temp2
- pause
复制代码
作者: newswan 时间: 2023-4-19 20:29
以前做过合并分离双语字幕,但你这个字幕和时间分离是为什么?
作者: lmq123 时间: 2023-4-19 22:02
回复 3# newswan
把无关的东西删除,方便查看而已
作者: newswan 时间: 2023-4-20 00:35
- function get_dic() {
- param(
- [string]$filename
- )
- $f1 = Get-Content -Encoding UTF8 $filename
- $f2 = $f1 -match "\S"
-
- $arr = [System.Collections.Specialized.OrderedDictionary]@{}
- $f2 | ForEach-Object -Begin { $i = 0 } {
- if ( $i -eq 0 ) {
- $i = $_ -replace "[.]+$",""
- }
- else {
- $arr.add( $i , $_ )
- $i = 0
- }
- }
-
- return $arr
- }
-
- $arrT = get_dic "4月10日时间.srt"
- $arrS = get_dic "4月10日内容demo1.srt"
-
- $srt = foreach ( $key in $arrT.keys ) {
- $key
- $arrT[$key]
- $arrS[$key]
- ""
- }
-
- $srt | Out-File -Encoding utf8 "4月10日.srt"
复制代码
demo 里面 有几个数字后面,多带了 一个 .复制代码
作者: qixiaobin0715 时间: 2023-4-20 09:37
本帖最后由 qixiaobin0715 于 2023-4-20 14:28 编辑
回复 1# lmq123
newswan看的很细致,这个都能发现。
现在有很多人,你写了代码来帮助他解决问题,代码是否有问题也不说一声,闷着。唉!
2楼代码写的匆忙,问题不止一个,比如变量延迟未开,newswan所说的编号非纯数字,有的后面带点号等等,如果还是按照2楼的思路,并且楼主的文件不再有别的意外出现,这样应当可以:
表示时间的文件为times.srt
表示对话的文件为demo.srt- @echo off
- chcp 65001>nul
- findstr . times.srt>temp2
- findstr . demo.srt>temp1
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (temp1) do (
- set /p str=
- set m=%%i
- set /a n=m
- if "!n!"=="%%i" (
- echo,!n!
- ) else if "!n!."=="%%i" (
- echo,!n!
- ) else (
- echo,!str!
- echo,%%i
- echo,
- )
- ))<temp2>Merge.srt
- del /f temp1 temp2
- pause
复制代码
注意:代码中用了两个临时文件,内容临时文件temp1一定要放在for循环in后的括号里,而时间临时文件temp2放在“<”后,因为这种方法不适合“代码页编号为65001”时,读取编码为UTF-8含有双字节字符的文本。
作者: newswan 时间: 2023-4-20 13:30
回复 6# qixiaobin0715
伸手党是这样, 就当自己练习了
作者: lmq123 时间: 2023-4-20 19:50
回复 7# newswan
这俩天下地干活了,还没测试,明天早上我去测试结果一下,公布效果如何
作者: lmq123 时间: 2023-4-20 19:53
回复 2# qixiaobin0715
你这个没有效果合并不了,不知道为什么,我时间与内容文档是任意名称的,只是时间文档名中含有时间2字,名称又可能有3~10个字之多,内容文档名称也是类似的规律
作者: qixiaobin0715 时间: 2023-4-21 08:19
既然文件名不确定就用set /p。运行批处理后输入文件名及路径或拖入文件。
作者: lmq123 时间: 2023-4-21 19:46
回复 10# qixiaobin0715
我不会改代码,麻烦您帮我改一下吧,谢谢了,内容文档与时间文档名称是随机任意的
作者: terse 时间: 2023-4-21 20:30
代码中关键词自己修改为符合实际文件名- @echo off&setlocal enabledelayedexpansion
- chcp 65001 >nul
- for /f "delims=" %%a in ('dir /b /a-d *内容*.srt *时间*.srt') do (
- set /a n+=1,i=j=0
- for /f "usebackq delims=" %%i in ("%%a") do (
- set /a i=~i
- if !i! equ 0 (
- set "!n!.!j!=%%i"
- ) else set /a j+=1
- )
- )
- (for /l %%i in (1,1,!j!) do (
- echo;%%i
- echo;!2.%%i!
- echo;!1.%%i!
- echo;
- ))>ttt.srt
- pause
复制代码
作者: qixiaobin0715 时间: 2023-4-22 12:49
回复 11# lmq123
你描述的不清晰,我也没有仔细看,理解有误,代码与实际需求有出入,还是试试别人的答案吧。
作者: qixiaobin0715 时间: 2023-4-23 15:42
2楼、6楼代码作废,看看这样是不是符合你的需求:- @echo off &@cls&chcp>nul 65001
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *时间*.srt') do findstr "." "%%i">temp
- for /f "delims=" %%a in ('dir /b /a-d *内容*.srt') do (
- (for /f "delims=" %%i in ('type "%%a"') do (
- set /p str=
- set m=%%i
- set /a n=m
- if "!n!"=="%%i" (
- echo,!n!
- ) else if "!n!."=="%%i" (
- echo,!n!
- ) else (
- echo,!str!
- echo,%%i
- echo,
- )
- ))<temp>Merge-%%a
- )
- del temp
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |