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| csvThis 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| csvNow 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 slowerRé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!