我想我第一次解释问题时可能做得不够好。
我想打开一堆文本和二进制文件,并用我的正则表达式扫描这些文件。我需要从csv获取第二列中的数据,这是所有文件的路径,作为指向要打开的文件的方法。
打开文件后,通过文件扫描正则表达式,如果匹配任何内容,它将显示在屏幕上。对不起,我很抱歉,非常感谢你们! -
您好,
我很抱歉询问可能是一个简单的问题。我是ruby的新手并且会感谢任何指导。
我正在尝试使用csv文件作为索引来利用其他操作。
特别是,我有一个csv文件,如下所示:
id, file, description, date
1, /dir_a/file1, this is the first file, 02/10/11
2, /dir_b/file2, this is the second file, 02/11/11
我想打开“文件”列中定义的每个文件,并搜索正则表达式。
我知道您可以使用CSV类
定义每列中的标题require 'rubygems'
require 'csv'
require 'pp'
index = CSV.read("files.csv", :headers => true)
index.each do |row|
puts row ['file']
end
我知道如何创建一个循环来打开每个文件并搜索每个文件中的正则表达式,如果有,则显示它:
regex = /[0-9A-Za-z]{8,8}-[0-9A-Za-z]{4,4}-[0-9A-Za-z]{4,4}-[0-9A-Za-z]{4,4}-[0-9A-Za-z]{12,12}/
Dir.glob('/home/Bob/**/*').each do |file|
next unless File.file?(file)
File.open(file, "rb") do |f|
f.each_line do |line|
f.each_line do |line|
unless (pattern = line.scan(regex)).empty?
puts "#{pattern}"
end
end
end
end
end
有没有办法可以使用我的csv文件中第二列的内容作为我的变量打开每个文件,搜索正则表达式,如果文件中有匹配项,则输出csv中的行与新的csv匹配?
提前谢谢!!!!
答案 0 :(得分:0)
快速浏览一下,您可以将其缩小为:
index.each do |row|
File.foreach(row['file']) do |line|
puts "#{pattern}" if (line[regex])
end
end
CSV文件不应该是二进制文件,因此您可以在打开文件时删除“rb”,让我们将文件读取减少到foreach
,这会迭代文件,逐行返回。
根据示例代码,目录层次结构中文件的深度会受到质疑。目前还不清楚那里发生了什么。
编辑:
它告诉我“正则表达式”是一个未定义的变量
在你的问题中你说:
regex = /[0-9A-Za-z]{8,8}-[0-9A-Za-z]{4,4}-[0-9A-Za-z]{4,4}-[0-9A-Za-z]{4,4}-[0-9A-Za-z]{12,12}/
我打开进行搜索的文件可能是二进制文件。
根据规范:
CSV的常见用法是US-ASCII,但IANA为“文本”树定义的其他字符集可以与“charset”参数一起使用。
接着说:
安全注意事项:
CSV文件包含不应构成任何内容的被动文本数据 风险。但是,理论上可能存在恶意二进制文件 可以包括数据以便利用潜在的缓冲区溢出 在程序中处理CSV数据。此外,私人数据 可以通过这种格式共享(当然这适用于任何文本 数据)。
所以,如果您看到二进制数据,则不应该,因为根据规范,它不是CSV。不幸的是,这些规范多年来一直被滥用,所以你可能会在文件中看到二进制数据。如果是这样,继续使用'rb'作为文件模式,但要小心。
要问的一个重要问题是,您是否可以使用Ruby的CSV库来阅读该文件,这使得很多文章成为讨论。