Ruby: использование CSV в качестве базы данных - PullRequest
0 голосов
/ 15 февраля 2011

Я думаю, что я, возможно, недостаточно хорошо объяснил свой вопрос в первый раз.

Я хочу открыть кучу текстовых и двоичных файлов и отсканировать эти файлы с помощью моего регулярного выражения.Что мне нужно от 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

Я хочу открыть каждый файл, определенный в столбце «file», и найти регулярное выражение.

Я знаю, что вы можете определить заголовки в каждом столбце с помощью 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?

Заранее спасибо !!!!

1 Ответ

0 голосов
/ 15 февраля 2011

На первый взгляд кажется, что вы можете уменьшить его до:

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 в соответствии сспекуляцияК сожалению, спецификация злоупотребляла годами, поэтому возможно, что вы видите двоичные данные в файле.Если да, то продолжать использовать «радиоканал» в файловом режиме, но делать это осторожно.

1039 * Важный вопрос, чтобы спросить, можно ли прочитать файл, используя библиотеку CSV Руби, которая делает много это спорное обсуждение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...