Comment Lire et Analyser des Fichiers CSV Avec Ruby

CSV signifie « Valeurs Séparées Par des Virgules ».

C’est un format de données commun composé de lignes avec des valeurs séparées par des virgules. Il est utilisé pour exporter & importer des données.

Par exemple :

Vous pouvez exporter vos contacts Gmail sous forme de fichier CSV, et vous pouvez également les importer en utilisant le même format.

Voici à quoi ressemble un fichier CSV:

id,name1,chocolate2,bacon3,apple4,banana5,almonds

Maintenant, vous allez apprendre à utiliser la bibliothèque Ruby CSV pour lire & écrire des fichiers CSV.

Analyse CSV Ruby

Ruby est livré avec une bibliothèque CSV intégrée.

Vous pouvez lire un fichier directement:

require 'csv'CSV.read("favorite_foods.csv")

Ou vous pouvez analyser une chaîne avec des données CSV:

require 'csv'CSV.parse("1,chocolate\n2,bacon\n3,apple")

Le résultat ?

Vous obtenez un tableau à deux dimensions où chaque entrée est une ligne dans la table.

Cela ressemble à ceci:

, , , , , ]

Vous pouvez utiliser des indices de tableau tels que data pour travailler avec ces données.

Mais il y a un meilleur moyen!

Options CSV

Si votre fichier contient des en-têtes, vous pouvez indiquer à l’analyseur CSV de les utiliser.

table = CSV.parse(File.read("cats.csv"), headers: true)

Maintenant, au lieu d’un tableau multidimensionnel, vous obtenez un objet de table CSV.

Voici la description:

 » A CSV::Table est une structure de données bidimensionnelle pour représenter des documents CSV. Les tableaux vous permettent de travailler avec les données par ligne ou colonne, de manipuler les données et même de convertir les résultats en CSV. »

Étant donné l’une de ces tables, vous pouvez obtenir les données dont vous avez besoin à partir de n’importe quelle ligne.

Exemple:

table# "1"table# "chocolate"

Voici 0 la première ligne, id & name sont les noms des colonnes.

Il existe deux modes de table:

  • by_col
  • by_row

En changeant le mode table (row par défaut), vous pouvez regarder les données sous différents angles.

Par exemple:

table.by_col# table.by_col# 

Ici 0 est la première colonne, 1 est la deuxième colonne.

Ces deux méthodes renvoient une copie de la table.

Si vous souhaitez apporter des modifications à la table d’origine, vous pouvez utiliser les méthodes by_col! & by_row!.

Cela va être plus économe en mémoire car aucune copie de la table n’est créée.

Comment utiliser les convertisseurs CSV

Vous avez peut-être remarqué que nous avons notre colonne id sous forme de tableau de chaînes.

Et si nous avons besoin d’entiers?

Vous pouvez les obtenir en appelant to_i sur chaque chaîne…

Mais il y a un raccourci!

La bibliothèque Ruby CSV implémente quelque chose appelé convertisseurs.

Un convertisseur transformera automatiquement les valeurs pour vous.

Par exemple:

CSV.parse("1,2,3,4,5")# ]CSV.parse("1,2,3,4,5", converters: :numeric)# ]

Il y a 6 convertisseurs intégrés:

  • Entier
  • Float
  • Numérique (Float + Entier)
  • Date
  • DateTime
  • Tous

Mais vous pouvez également créer vos propres convertisseurs personnalisés.

Voici comment:

CSV::Converters = ->(value) { value.to_sym rescue value }

Vous pouvez utiliser votre nouveau convertisseur comme ceci:

CSV.parse("a,b,c", headers: false, converters: :symbol)# ]

Comment créer un nouveau fichier CSV

En plus de pouvoir analyser & lire les fichiers CSV de différentes manières, vous pouvez également créer un fichier CSV à partir de zéro.

C’est le moyen le plus simple:

cats = , , ]cats.map { |c| c.join(",") }.join("\n")

Vous pouvez également utiliser la méthode generate:

CSV.generate do |csv| csv 

This prepares the data to be in the right format.

If you want to write to a file you'll have to use something like , or instead of you can use with a file name & write mode enabled.

CSV.open("cats.csv", "w") do |csv| csv 

Now you have a new CSV file!

CSV Gems & Performance

The built-in library is fine & it will get the job done.

But you can also find a few CSV parsing gems with different features.

For example, the gem will convert your CSV data into an array of hashes.

Example:

require 'smarter_csv'IntegerConverter = Object.newdef IntegerConverter.convert(value) Integer(value)endSmarterCSV.process('testing.csv', value_converters: { id: IntegerConverter })# 

Voici une comparaison des performances:

Comparison: CSV: 112.9 i/sSmarter CSV: 21.7 i/s - 5.21x slower Tabular: 17.3 i/s - 6.52x slower

Résumé

Vous avez appris à lire & écrire des fichiers CSV dans Ruby ! Vous avez également découvert les gemmes Rubis alternatives de convertisseurs & pour traiter vos données CSV.

Si vous souhaitez traiter de gros fichiers CSV (> 10 Mo), vous pouvez utiliser la méthode CSV.foreach(file_name) avec un bloc. Cela lira une ligne à la fois & utilise beaucoup moins de mémoire.

Veuillez partager cet article pour que plus de gens puissent le trouver!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.