Ruby脚本问题

Ruby脚本问题,ruby,Ruby,我正在尝试创建一个ruby脚本,但在如何继续上我遇到了困难 我的脚本的目标是,从2个字幕文件中,我想通过结合第一个文件的时间和第二个文件的字幕来生成第三个文件 我不知道我是否清楚,基本上,我的两个字幕文件是相同的,但版本不同,即相同序列之间的时间可能不同 以下是期望的结果: # File One : Version KILLERS (English) 1 00:00:01,874 --> 00:00:05,577 <i>Previously on "12 Monkeys".

我正在尝试创建一个ruby脚本,但在如何继续上我遇到了困难

我的脚本的目标是,从2个字幕文件中,我想通过结合第一个文件的时间和第二个文件的字幕来生成第三个文件

我不知道我是否清楚,基本上,我的两个字幕文件是相同的,但版本不同,即相同序列之间的时间可能不同

以下是期望的结果:

# 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 }