2011-02-14 132 views
0

我认为我第一次解释我的问题可能做得不够好。Ruby:使用csv作为数据库

我想打开一堆文本和二进制文件,并用我的正则表达式扫描这些文件。我需要从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

为什么两个`f.each_line do | line |`? – 2011-02-15 22:06:14

+0

尝试使用Solr http://lucene.apache.org/solr/ – 2014-05-23 20:32:41

回答

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为“文本”树中定义可以结合使用的“字符集”参数。

它接着说:

安全考虑:

CSV文件包含应该不会构成任何风险 被动文本数据。然而,理论上可能包含恶意二进制数据以便利用程序处理CSV数据中的潜在缓冲区溢出 。另外,私人数据 可以通过这种格式共享(当然这适用于任何文本 数据)。

因此,如果你看到二进制数据,你不应该因为它不是CSV根据规范。不幸的是,这些规范多年来一直被滥用,所以你可能会看到文件中的二进制数据。如果是这样,请继续使用'rb'作为文件模式,但要小心谨慎。

要问的一个重要问题是,您是否可以使用Ruby的CSV库来读取文件,这使得很多讨论都成为讨论。

相关问题