Quelle est la meilleure façon (la plus efficace) d'analyser un fichier délimité par des tabulations dans Ruby?Quelle est la meilleure façon d'analyser un fichier délimité par des tabulations dans Ruby?
Répondre
La bibliothèque Ruby CSV vous permet de spécifier le délimiteur de champ. Ruby 1.9 utilise FasterCSV. Quelque chose comme ceci fonctionnerait:
require "csv"
parsed_file = CSV.read("path-to-file.csv", { :col_sep => "\t" })
Les règles pour TSV sont en fait un peu différentes de CSV. La principale différence est que CSV a des dispositions pour coller une virgule à l'intérieur d'un champ, puis en utilisant des guillemets et des guillemets d'échappement à l'intérieur d'un champ. J'ai écrit un exemple rapide pour montrer comment la simple réponse échoue:
require 'csv'
line = 'boogie\ttime\tis "now"'
begin
line = CSV.parse_line(line, col_sep: "\t")
puts "parsed correctly"
rescue CSV::MalformedCSVError
puts "failed to parse line"
end
begin
line = CSV.parse_line(line, col_sep: "\t", quote_char: "Ƃ")
puts "parsed correctly with random quote char"
rescue CSV::MalformedCSVError
puts "failed to parse line with random quote char"
end
#Output:
# failed to parse line
# parsed correctly with random quote char
Si vous souhaitez utiliser la bibliothèque CSV, vous pouvez utiliser un caractère de citation aléatoire que vous ne vous attendez pas à voir si votre fichier (l'exemple montre ceci), mais vous pouvez également utiliser une méthode plus simple comme la classe StrictTsv montrée ci-dessous pour obtenir le même effet sans avoir à vous soucier des citations de terrain.
# The main parse method is mostly borrowed from a tweet by @JEG2
class StrictTsv
attr_reader :filepath
def initialize(filepath)
@filepath = filepath
end
def parse
open(filepath) do |f|
headers = f.gets.strip.split("\t")
f.each do |line|
fields = Hash[headers.zip(line.split("\t"))]
yield fields
end
end
end
end
# Example Usage
tsv = Vendor::StrictTsv.new("your_file.tsv")
tsv.parse do |row|
puts row['named field']
end
Le choix d'utiliser la bibliothèque CSV ou quelque chose de plus stricte dépend juste de qui vous envoie le fichier et s'ils attendent d'adhérer à la norme stricte de TSV.
Détails sur la norme TSV se trouvent à http://en.wikipedia.org/wiki/Tab-separated_values
Veuillez inclure des extraits de code avec la réponse, * not * dans un aperçu externe. Cet aspect semble maintenant être en baisse, ce qui est une véritable honte. –
@JezenThomas merci pour les heads-up. J'ai tiré tous les échantillons de code en ligne pour résoudre le problème d'avoir à aller voir l'essentiel – mmmries
bonne réponse. . Je suis surpris de voir comment horriblement '\ d' échoue avec l'analyseur CSV. – dps
J'aime mmmries réponse. Cependant, je déteste la façon dont ruby enlève toutes les valeurs vides de la fin d'une scission. Il ne s'agit pas non plus de supprimer le retour à la ligne à la fin des lignes.
En outre, j'avais un fichier avec des nouvelles lignes potentielles dans un champ. Alors, je réécris son « parse » comme suit:
def parse
open(filepath) do |f|
headers = f.gets.strip.split("\t")
f.each do |line|
myline=line
while myline.scan(/\t/).count != headers.count-1
myline+=f.gets
end
fields = Hash[headers.zip(myline.chomp.split("\t",headers.count))]
yield fields
end
end
end
Cette concaténer toutes les lignes que nécessaire pour obtenir une gamme complète de données, et renvoie toujours l'ensemble des données (sans entrées néant potentiel à la fin).
- 1. Quelle est la meilleure façon de réorganiser les colonnes dans un fichier texte délimité par des tabulations dans vim?
- 2. Création d'un fichier ASCII délimité par des tabulations dans Rails
- 3. Asp.net créant un fichier txt délimité par des tabulations
- 4. Quelle est la meilleure façon de lire un fichier de configuration délimité par des virgules?
- 5. Cotations dans un fichier délimité par des tabulations
- 6. Quelle est la meilleure façon d'écrire dans un fichier Ruby?
- 7. Python: l'indexation d'un fichier qui est délimité par des tabulations
- 8. Comment générer un fichier txt délimité par des tabulations?
- 9. Utiliser fgetcsv pour un fichier délimité par des tabulations
- 10. Quelle est la meilleure façon de diviser les données de chaîne qui est délimité dans php
- 11. traitant des doubles onglets dans un fichier délimité par des tabulations en PHP
- 12. Importer un fichier texte délimité par des tabulations pour accéder à la base de données
- 13. Comment ignorer des lignes supplémentaires avant l'en-tête d'un fichier délimité délimité par des tabulations dans R
- 14. Stockage de données ascii et binaires dans un seul fichier délimité par des tabulations
- 15. Importation de valeurs NULL dans un fichier délimité par des tabulations à l'aide de SSMS 2005
- 16. Quelle est la meilleure façon d'afficher un fichier long?
- 17. Quelle est la meilleure façon de lire les données CSV?
- 18. Regex avec texte délimité par des tabulations contenant \ x09
- 19. Quelle est la meilleure façon d'exécuter un programme Ruby à partir d'un programme Ruby?
- 20. besoin de librairie pour ocr une page imprimée et créer un fichier délimité par des tabulations
- 21. Meilleure façon d'aborder le chargement d'une classe à partir d'un fichier délimité par des virgules
- 22. Comment analyser une ligne de texte séparée par des tabulations dans Ruby?
- 23. quelle est la meilleure façon de modifier le fichier csv
- 24. Lecture à partir d'un fichier texte délimité par des virgules ou des tabulations
- 25. Quelle est la meilleure façon d'implémenter hashCode()?
- 26. Quelle est la meilleure façon d'arrêter un thread dans Java?
- 27. Quelle est la meilleure façon de trier par date?
- 28. Quelle est la meilleure façon de faire la création Ruby gemspec et la gestion des dépendances?
- 29. Extraction de données à partir d'un fichier délimité par des tabulations avec JavaScript
- 30. Quelle est la meilleure façon d'implémenter un sondage dans Joomla?
Attention, cette approche échouera si l'une des valeurs séparées par des tabulations contient un guillemet. La suggestion StrictTsv dans l'autre réponse est plus robuste. –