Как извлечь целое число (год) и комбинацию букв и цифр из каждой строки в файле - PullRequest
0 голосов
/ 02 апреля 2019

Я работаю над программой, которая читает файл, который содержит различную информацию о мобильных телефонах, затем извлекает и сохраняет каждый фрагмент информации. Например, вот две из многих строк из файла:

12hrs,Smartphone,2015WB0126A,used,Apple,2000$,{Bluetooth,Water resistant,fingerprint reader,16GB},white,2016
Used,Smartwatch,Samsung,{activity tracker,Bluetooth,water resistant},2017,250$,black,3947t4f,9hrs

В первой строке выше я хочу извлечь 2016 как год вместо 2015 и 2000. И я хочу извлечь 2015WB0126A в качестве модели (любую случайную комбинацию букв и цифр) вместо 12hrs и 2000$. Может кто-то помочь мне с этим? Большое спасибо.

f = File.open("listings.txt", "r")
f.each_line do |line|
  puts line
  year=line[/20+[0-9]+[0-9]/]
  puts "made in #{year}"
end

Для первой строки в примере я ожидаю, что год будет равен 2016, а модель будет 2015WB0126A.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019
f.each_line do |line|
  # find 20xx proceeded by line start or a comma,
  # and followed line end or a comma.
  # ?: makes the group non-capturing
  year = line.match(/(?:^|,)(20\d{2})(?:$|,)/)
  year = year[1] if year

  model = line.split(',').select do |s|
    # 7-30 word characters in length
    s =~ /^\w{7,30}$/ &&
    # at least 5 digits anywhere in the word
    s =~ /(\d.*){5}/
  end

  puts "#{model.first} made in #{year}"
end

Надеемся, что есть некоторые разумные квалификаторы для модели, которые работают с остальными вашими данными, поскольку они довольно наивны.

https://regex101.com/ может дать подробное объяснение любого регулярного выражения, еслиВы хотите больше подробностей о том, как именно они работают.Вы также можете использовать https://rubular.com/, чтобы проверить точный вкус регулярных выражений в ruby.

0 голосов
/ 03 апреля 2019

Чтобы справиться с этим, мы должны сначала определить шаблоны.

из двух предоставленных вами строк, мы знаем, что это информация о мобильном телефоне. тогда мы можем предположить:

  1. поля, разделенные ','
  2. год в этом столетии, 20xx - хорошее предположение
  3. модель - это нечто не понятное человеку
def extract(str)
  fields = str.split(",")
  year = fields.find { |f| f.match /^20\d\d$/}
  model = fields.find do |f|
    f.match /\d/ and f.match /[a-zA-Z]/ and !f.match /\d+(hrs|hr|hour|hours|gb)/i
  end
  return year, model
end

в коде я предполагаю, что модель содержит цифры и буквы. Я исключаю часы и размер (ГБ), а также. мы также можем создать список слов. Потому что информация о мобильном телефоне, я думаю, список не длинный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...