Récupération de données dans Rails en traitant CSV

L'application Ruby on Rails pour récupérer le lien téléchargé à partir du fichier CSV et

trouver l'occurrence d'un lien dans une page particulière.

Dans l'application, l'utilisateur doit transmettre un fichier CSV et une liste de courrier électronique des utilisateurs auxquels le CSV analysé sera envoyé.

Dans le csv, il y aura trois 2 colonnes :

  • lien_de référence
  • lien_accueil
  • et il y a des valeurs comme ci-dessous

Tout d’abord nous allons créer l’application rails

$ lance le nouveau scrape_data

$ cd scrape_data

Ensuite, nous générerons le module UploadCsv, exécuterons la commande ci-dessous

$ rails g échafaudage UploadCsv généré_csv : chaîne csv_file : chaîne

Cela créera tous les modèles, contrôleurs et migrations requis pour csv_file

Ensuite, nous commencerons par télécharger le fichier dans DB

remplacez le code ci-dessous dans les fichiers  app/views/upload_csvs/_form.html.erb

nous avons ajouté le code ci-dessous pour télécharger le fichier en vue

<%= form_with(modèle : upload_csv, local : true) do |form| %>

  <% si upload_csv.errors.any ? %>

    <div id="”error_explanation”">

      <h2><%= pluralize(upload_csv.errors.count, “error”) %> interdit l&#039;enregistrement de ce upload_csv :</h2>

     

            <% upload_csv.errors.full_messages.each fait |message| %>

             

  • <%=message %>
  •         <% fin %>

         

    </div>

  <% fin %>

  <div class="”field”">

    <%=form.label :csv_file %>

    <%=form.file_field :csv_file %>

  </div>

  <div class="”actions”">

    <%=form.submit %>

  </div>

<% fin %>

Ensuite, nous ajouterons la gemme pour télécharger un fichier_csv

ajoutez la ligne ci-dessous dans le fichier gem

gemme 'carrierwave', '~> 2.0'

Installation du bundle $

Ensuite, nous créerons le téléchargeur dans Carrierwave

Les rails $ génèrent un avatar de téléchargeur

nous joindrons le téléchargeur dans le modèle

app/models/upload_csv.rb

classe UploadCsv <ApplicationRecord

  mount_uploader :csv_file, AvatarUploader

fin

avant d'aller plus loin, vérifiez simplement que votre application fonctionne

exécuter les commandes ci-dessous

$ rake db: créer une base de données: migrer

mettre à jour les itinéraires

Rails.application.routes.draw faire

  ressources :upload_csvs

  racine 'upload_csvs#index'

fin

Rails $

Ensuite, nous créerons un Job pour lire le fichier CSV et en extraire le lien

et le fichier généré sera enregistré dans la colonne générée_csv de ces enregistrements

pour générer le travail, nous ferons comme ci-dessous

Les rails $ génèrent du travail générer_csv

ajoutez la gemme ci-dessous et exécutez l'installation du bundle

joyau 'httpparty'

gemme 'nokogiri'

alors nous remplacerons le code par ci-dessous

classe GenrateCsvJob < ApplicationJob

  queue_as : par défaut

  def effectuer (upload_csv)

    traité_csv (upload_csv)

    file = Tempfile.open([“#{Rails.root}/public/generated_csv”, '.csv']) do |csv|

      csv << %w[referal_link home_link count]

      @new_array.each fait |new_array|

        csv << nouveau_array

      fin

      fichier = « #{Rails.root}/public/product_data.csv »

      en-têtes = ['referal_link', 'home_link', 'count']

      file = CSV.open(file, 'w', write_headers : true, headers : headers) do |writer|

        @new_array.each fait |new_array|

          écrivain << new_array

        fin

        upload_csv.update(generated_csv : fichier)

      fin

    fin

    NotificationMailer.send_csv(upload_csv).deliver_now ! si @new_array.present ?

    #besoin de générer le mailer et de suivre les étapes du mailer

  fin

  Méthode # pour obtenir le nombre de liens et les magasins dans le tableau

  def traité_csv (upload_csv)

    @new_array = []

    CSV.foreach(upload_csv.csv_file.path, headers : true, header_converters : :symbol) do |row|

      row_map = rangée.to_h

      page = HTTParty.get(row_map[:refferal_link])

      page_parse = Nokogiri :: HTML (page)

      link_array = page_parse.css('a').map { |lien| lien['href'] }

      link_array_group = link_array.group_by(&:lui-même).map { |k, v| [k, longueur v.] }.to_h

      @new_array.push([row_map[:refferal_link], row_map[:home_link], (link_array_group[row_map[:home_link]]).to_s])

    fin

  fin

fin

Ensuite, nous joindrons le travail after_create de upload_csvs et nous ajouterons la validation pour csv_file require

 veuillez mettre à jour le code de  app/models/upload_csv.rb

classe UploadCsv <ApplicationRecord

  mount_uploader :csv_file, AvatarUploader

  after_create :processed_csv

  def traité_csv

    GenrateCsvJob.perform_later(self)

  fin

fin

puis vérifiez après avoir téléchargé le fichier, votre fichier généré par scrape sera mis à jour, vous pouvez vérifier le csv généré

à l'intérieur  /scrape_data/public/product_data.csv

nous pouvons envoyer par e-mail en utilisant les instructions ci-dessous

Nous allons d’abord générer le mailer

Les rails $ génèrent le mailer NotificationMailer

mettre à jour le code de app/mailers/notification_mailer.rb

  def send_csv(upload_csv)

    @greeting = 'Bonjour'

    pièces jointes['parsed.csv'] = Fichier.read(upload_csv.generated_csv)

    mail (à : « [email protected] », sujet : « CSV est analysé avec succès. »)

  fin

fin

veuillez configurer également la configuration du courrier config/environments/development.rb ou production.rb

ajouter les lignes ci-dessous dans le fichier

config.action_mailer.default_url_options = { hôte : 'https://sample-scrape.herokuapp.com/' }

config.action_mailer.delivery_method = :smtp

config.action_mailer.smtp_settings = {

  nom_utilisateur : '[email protected]',

  mot de passe : '*******123456',

  domaine : 'gmail.com',

  adresse : 'smtp.gmail.com',

  port : '587',

  authentification : plain

}

config.action_mailer.raise_delivery_errors = faux

et mettez également à jour la vue app/views/notification_mailer/send_csv.html.erb

<h1>Le CSV a été traité, merci !</h1>

<p>

  <%= @greeting %>, veuillez vérifier la pièce jointe pour recevoir l'e-mail

</p>

Merci !

Abonnez-vous pour les dernières mises à jour

Articles Similaires

Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

fr_FRFrench