gpt4 book ai didi

ruby - 用 ruby​​ 删除文件的前两行

转载 作者:数据小太阳 更新时间:2023-10-29 07:34:49 24 4
gpt4 key购买 nike

我的脚本读取大型文本文件并使用正则表达式抓取第一页。我需要删除每个第一页的前两行或更改正则表达式以匹配 ==Page 1== 字符串之后的 1 行。我在这里包含了整个脚本,因为在过去的问题中有人问过我,而且我是 ruby​​ 的新手,并不总是知道如何将片段集成为答案:

#!/usr/bin/env ruby -wKU
require 'fileutils'

source = File.open('list.txt')
source.readlines.each do |line|
line.strip!
if File.exists? line
file = File.open(line)
end

text = (File.read(line))
match = text.match(/==Page 1(.*)==Page 2==/m)
puts match
end

最佳答案

现在,当你更新了你的问题后,我不得不删除大部分这么好的答案:-)

我想您的问题的要点是您想使用 match[1] 而不是 matchRegexp.match方法返回的对象(MatchData)可以被当作一个数组,将整个匹配的字符串作为第一个元素,后面的元素中的每个子查询.因此,在您的情况下,变量 match (and match[0]) 是整个匹配的字符串 (连同 '== Page..==' marks),但您只需要隐藏在 match[1] 中的第一个子表达式。


现在谈谈我在您的代码中感觉到的其他小问题。如果您已经知道我在说什么,请不要生气,但也许其他人会从这些警告中获益。

您的代码的第一部分(if File.exists? 行)是检查文件是否存在,但您的代码只是打开了文件(没有关闭它! ) 并且在几行之后仍然试图打开文件。

您可以改用这一行:

next unless File.exists? line

第二是程序应该准备好处理文件没有页面标记的情况,因此它与模式不匹配。 (变量 match 将是 nil)

第三个建议是可以使用稍微复杂一点的模式。当前的 (/==Page 1==(.*)==Page 2==/m) 将返回以 End-Of-Line 标记作为第一个字符的页面内容。如果您使用这种模式:

/==Page 1==\s*\n(.*)==Page 2==/m

那么子表达式将不包含与 '==Page 1==` 文本位于同一行的空格。如果你使用这种模式:

/==Page 1==\s*\n(.*\n)==Page 2==/m

那么您将确定'==Page 2=='标记从该行的开头开始。

第四个问题是程序员(当然有时也包括我)往往会在打开文件后忘记关闭文件。在您的情况下,您打开了“源”文件,但在代码中,循环后没有 source.close 语句。处理文件最安全的方法是将 block 传递给 File.open 方法,因此您可以在程序的第一行中使用以下形式:

File.open('list.txt') do |source|
source.readlines.each do |line|

...但在这种情况下,只写:

File.readlines('list.txt').each do |line|

综合起来,代码可能看起来像这样(为了更好的代码可读性,我将变量 line 更改为 fname):

#!/usr/bin/env ruby -wKU
require 'fileutils'

File.readlines('list.txt').each do |fname|
fname.strip!
next unless File.exists? fname

text = File.read(fname)
if match = text.match(/==Page 1==\s*\n(.*\n)==Page 2==/m)
# The whole 'page' (String):
puts match[1].inspect
# The 'page' without the first two lines:
# (in case you really wanted to delete lines):
puts match[1].split("\n")[2..-1].inspect
else
# What to do if the file does not match the pattern?
raise "The file #{fname} does NOT include the page separators."
end
end

关于ruby - 用 ruby​​ 删除文件的前两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com