Ruby脚本问题
我正在尝试创建一个ruby脚本,但在如何继续上我遇到了困难 我的脚本的目标是,从2个字幕文件中,我想通过结合第一个文件的时间和第二个文件的字幕来生成第三个文件 我不知道我是否清楚,基本上,我的两个字幕文件是相同的,但版本不同,即相同序列之间的时间可能不同 以下是期望的结果:Ruby脚本问题,ruby,Ruby,我正在尝试创建一个ruby脚本,但在如何继续上我遇到了困难 我的脚本的目标是,从2个字幕文件中,我想通过结合第一个文件的时间和第二个文件的字幕来生成第三个文件 我不知道我是否清楚,基本上,我的两个字幕文件是相同的,但版本不同,即相同序列之间的时间可能不同 以下是期望的结果: # File One : Version KILLERS (English) 1 00:00:01,874 --> 00:00:05,577 <i>Previously on "12 Monkeys".
# File One : Version KILLERS (English)
1
00:00:01,874 --> 00:00:05,577
<i>Previously on "12 Monkeys"...</i>
2
00:00:05,625 --> 00:00:07,882
- Did Marion send you?
- Who?
3
00:00:07,938 --> 00:00:09,905
Marion, the boy's mother.
编辑:最终脚本随机故障 1-脚本运行问题:脚本运行,并因此错误而突然停止
./SyncScript.rb:25:in `block (4 levels) in <main>': invalid byte sequence in UTF-8 (ArgumentError)
from ./SyncScript.rb:18:in `loop'
from ./SyncScript.rb:18:in `block (3 levels) in <main>'
from ./SyncScript.rb:17:in `open'
from ./SyncScript.rb:17:in `block (2 levels) in <main>'
from ./SyncScript.rb:16:in `open'
from ./SyncScript.rb:16:in `block in <main>'
from ./SyncScript.rb:15:in `open'
from ./SyncScript.rb:15:in `<main>'
/SyncScript.rb:25:in`block(4个级别)in':UTF-8中的字节序列无效(ArgumentError)
from./SyncScript.rb:18:in'loop'
from./SyncScript.rb:18:in'block(3层)in'
from./SyncScript.rb:17:in'open'
from./SyncScript.rb:17:in'block(2层)in'
from./SyncScript.rb:16:in'open'
from./SyncScript.rb:16:in'block in'
from./SyncScript.rb:15:in'open'
from./SyncScript.rb:15:in`'
2-Gliches(关于#的更多详细信息)
14#从1到16,效果非常好)
00:00:38,535 --> 00:00:40,832
Elle,这是收入!
15
00:00:49,746 --> 00:00:51,620
这是我的梦想
16
00:00:51,715 --> 00:00:54,749
这是我的生日
给我来杯咖啡。
00:01:01650-->00:01:04190#突然,没有序列号(这里是17)
这是一条蛇
00:01:04300-->00:01:06870#此处相同(编号18)
奎恩阿拉特
这是我们的方向。
19#然而,有19个。但没有空间(“\n”问题)
00:01:07,150 --> 00:01:10,740
先驱者,先驱者。
20#同样。。。
00:01:11,020 --> 00:01:13,080
现在就开始吧,
21
00:01:13,260 --> 00:01:16,770
乌蒙河畔的大毒蛇。
22
00:01:21,670 --> 00:01:22,730
停止
23
00:01:38,050 --> 00:01:40,050
呵!呵!
24
00:01:59,030 --> 00:02:01,090
我是你的朋友
阿普伦德广场酒店
25
00:02:01,130 --> 00:02:04,310
努斯埃文斯沃特酒店
26
00:02:06380-->00:02:11020#没有字幕??
27
00:02:11,690 --> 00:02:13,390
您有几个问题
(\D+)
,以解释数字后面的短语循环do
轻松实现File.open(ARGV[0], 'r') do |file_one|
File.open(ARGV[1], 'r') do |file_two|
File.open(ARGV[2], 'w') do |file_out|
loop do
line_one = file_one.gets
line_two = file_two.gets
break unless line_one and line_two #gets gives nil at EOF
if line_one.strip =~ /^(\d{2}):(\d{2}):(\d{2}),(\d{3})\D+(\d{2}):(\d{2}):(\d{2}),(\d{3})$/
temp = time_srt($1, $2, $3, $4) + ' --> ' +
time_srt($5, $6, $7, $8) #take time from line_one
if line_two.strip =~ /^(\d{2}):(\d{2}):(\d{2}),(\d{3})\D+(\d{2}):(\d{2}):(\d{2}),(\d{3})$/
file_out << temp + "\n" + file_two.gets #take phrase from file_two
file_one.gets #skip phrase in file_one
end
else
file_out << line_two #Keep file_two's lines when not a timestamp
end
end
end
end
end
File.open(ARGV[0],'r')do | File|u one|
open(ARGV[1],'r')do | File|u two|
File.open(ARGV[2],'w')do | File|u out|
环道
行\u one=文件\u one.get
第二行=文件第二行
中断,除非第1行和第2行在EOF处为零
如果行{u one.strip=~/^(\d{2}):(\d{2}):(\d{2}),(\d{3})\d+(\d{2}):(\d{2}):(\d{2}),(\d{3})$/
temp=时间(1美元、2美元、3美元、4美元)+'-->'+
时间(5美元、6美元、7美元、8美元)#从第一行开始
如果第2.strip行=~/^(\d{2}):(\d{2}):(\d{2}),(\d{3})\d+(\d{2}):(\d{2}):(\d{2}),(\d{3})$/
归档00:00:09905
马里恩,萨梅尔。
这是一种更像Ruby的方式来执行所需的替换
french_content.gsub(r) { english_lines.shift }
代码
def substitute(french_fname, english_fname)
r = /^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$/
english_lines = File.read(ENGLISH_FNAME).scan(r)
File.read(FRENCH_FNAME).gsub(r) { english_lines.shift }
end
示例
def substitute(french_fname, english_fname)
r = /^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$/
english_lines = File.read(ENGLISH_FNAME).scan(r)
File.read(FRENCH_FNAME).gsub(r) { english_lines.shift }
end
这是用Heredocs编写的两个文件的内容。(搜索“此处文档”
我们现在可以使用方法substitute
来计算根据需要修改的法语文件的内容(字符串,当然可以写入文件)
请参阅并回忆一下File.superclass#=>IO
接下来,让我们使用正则表达式从english\u content
中提取一个替换行数组
r = /^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$/
english_lines = english_content.scan(r)
#=> ["00:00:01,874 --> 00:00:05,577",
# "00:00:05,625 --> 00:00:07,882",
# "00:00:07,938 --> 00:00:09,905"]
注“^”
和“$”
是线首和线尾锚点,不要与线首(“\A”
)和线尾(“\z”
)锚点混淆
最后,我们使用具有相同正则表达式的方法来执行所需的替换
french_content.gsub(r) { english_lines.shift }
你说,“这就是我所尝试的”。我们是否假设它没有产生预期的结果?你真的需要一个例子。我建议你提供两个字符串,显示两个文件的内容,第三个字符串,显示你希望产生的文件的内容。为前两个字符串中的每个字符串分配一个变量会很有帮助(例如,
str1=“…”
,str2=“…”
)。通过这样做,读者可以在注释和答案中剪切和粘贴并引用这些变量,而无需定义它们。输入文件只需要几行(越少越好)。您可以说,“因此,我想替换每个…”,你不是倒过来了吗?我从翻译的文件中找到了它,但是脚本不会复制/粘贴时间,而是会这样做。大约有400多个序列/集:DI的意思是你不想替换每个“时间线”吗在第二个文件中包含第一个文件的时间?这很重要,因为它是问题陈述的一部分;它解释了您要执行的操作。注意:这将简单地排除第一个文件中的时间戳行,但不包括第二个文件中的时间戳行。如果要保留这些行,您还需要在嵌套的If
上添加else
。根据fect!它工作得非常好。非常感谢!对不起,我还不熟悉这个网站,谢谢你的评论。你好,又是我。脚本工作,但我碰巧遇到了随机故障。我用这些故障编辑了我的问题。@JohnDoe这可能是因为我在上面的第一条评论中说的^,你的两个文件在每个lin上都相同吗e除了时报?尝试在内部添加else
块,如果也只是将行两个打印到文件中
。时间和语言不同(但意思相同,行的nb…。好的,我稍后再试,我会回来告诉你一些消息:)哇,这是复杂的x)。我会尽力的
def substitute(french_fname, english_fname)
r = /^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$/
english_lines = File.read(ENGLISH_FNAME).scan(r)
File.read(FRENCH_FNAME).gsub(r) { english_lines.shift }
end
english =<<IGNOMINIOUS_END
1
00:00:01,874 --> 00:00:05,577
<i>Previously on "12 Monkeys"...</i>
2
00:00:05,625 --> 00:00:07,882
- Did Marion send you?
- Who?
3
00:00:07,938 --> 00:00:09,905
Marion, the boy's mother.
IGNOMINIOUS_END
french =<<BITTER_END
1
00:00:08,140 --> 00:00:11,850
<i>Précédemment...</i>
2
00:00:12,260 --> 00:00:14,120
- C'est Marion qui vous envoie ?
- Qui ?
3
00:00:14,150 --> 00:00:16,110
Marion, sa mère.
BITTER_END
ENGLISH_FNAME = "english"
FRENCH_FNAME = "french"
File.write(ENGLISH_FNAME, english)
#=> 191
File.write(FRENCH_FNAME, french)
#=> 182
puts substitute(french_fname, english_fname)
1
00:00:01,874 --> 00:00:05,577
<i>Précédemment...</i>
2
00:00:05,625 --> 00:00:07,882
- C'est Marion qui vous envoie ?
- Qui ?
3
00:00:07,938 --> 00:00:09,905
Marion, sa mère.
english_content = File.read(ENGLISH_FNAME)
french_content = File.read(FRENCH_FNAME)
r = /^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$/
english_lines = english_content.scan(r)
#=> ["00:00:01,874 --> 00:00:05,577",
# "00:00:05,625 --> 00:00:07,882",
# "00:00:07,938 --> 00:00:09,905"]
french_content.gsub(r) { english_lines.shift }