Сценарий Ruby, чтобы проверить, находится ли строка в файле? - PullRequest
4 голосов
/ 26 января 2012

У меня есть CSV-файл слов и их частот, а также .txt-файл , содержащий несколько слов, представляющих интерес, через пробел.

Я ищу способ проверить, есть ли для каждой строки CSV значение первого столбца (слово) также в файле .txt.

Я думаю, что-то похожеедо fgrep -x -f patternfile.txt data.csv за исключением только одного столбца CSV, а не всей строки?

Ответы [ 5 ]

4 голосов
/ 26 января 2012

Эй Вы можете использовать FasterCSV, чтобы открывать и циклически проходить через записи.

        FasterCSV.foreach("#{file_path}") do |row| 
        puts row[0]#row[0] is the first column only
        end 
2 голосов
/ 26 января 2012

Если мы используем bash, то это будет:

fgrep -x -f patternfile.txt data.csv | awk '{print $2}'

как простой способ получить второй столбец из результатов grep

1 голос
/ 26 января 2012

Используя awk, вы можете сделать что-то вроде этого -

awk -v FS="," 'NR==FNR{a[$1]=$0;next} ($1 in a){print a[$1]}' csv_file txt_file
  • Установите Разделитель полей на ,
  • Используя первый столбец (слово) вашего CSVфайл в качестве индекса загружает всю строку в массиве.
  • Проверьте, находится ли значение текстового файла в массиве.
  • Если это так, выведите его

Тест:

[jaypal:~/Temp] cat csv_file 
jack,4
rabbit,10
cat,4
red,39

[jaypal:~/Temp] cat txt_file 
red
rabbit
cat

[jaypal:~/Temp] awk -v FS="," 'NR==FNR{a[$1]=$0;next} ($1 in a){print a[$1]}' csv_file txt_file
red,39
rabbit,10
cat,4
1 голос
/ 26 января 2012

Чтобы проверить, есть ли в файле определенная строка хотя бы один раз:

IO.readlines(filename).map(&:chomp).include?("somestring")
0 голосов
/ 26 января 2012

Для объединения Фрогза и Ятиша ответов:

require 'csv'
words = File.readlines("words.txt").map(&:chomp)
CSV::foreach("data.csv") {|row| puts row.to_csv if words.include?(row[0])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...