2011-02-14 29 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庫來讀取文件,這使得很多討論都成爲討論。