Was ist die beste (effizienteste) Möglichkeit, eine durch Tabstopps getrennte Datei in Ruby zu analysieren?Was ist die beste Methode zum Analysieren einer durch Tabulatoren getrennten Datei in Ruby?
Antwort
In der Ruby CSV-Bibliothek können Sie das Feldtrennzeichen angeben. Ruby 1.9 verwendet FasterCSV. So etwas würde funktionieren:
require "csv"
parsed_file = CSV.read("path-to-file.csv", { :col_sep => "\t" })
Die Regeln für TSV sind eigentlich ein bisschen anders als CSV. Der Hauptunterschied besteht darin, dass CSV Vorkehrungen für das Einfügen eines Kommas in ein Feld und das Verwenden von Anführungszeichen und das Entfernen von Anführungszeichen in einem Feld enthält. Ich schrieb ein kleines Beispiel zu zeigen, wie die einfache Antwort ausfällt:
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
Wenn Sie die CSV-Bibliothek verwenden möchten, können Sie eine zufällige Anführungszeichen verwendet, die Sie nicht erwarten, wenn Sie Ihre Datei (im Beispiel zu sehen Dies kann aber auch mit einer einfacheren Methode wie der StrictTsv-Klasse erreicht werden, um den gleichen Effekt zu erzielen, ohne sich um Feldnotierungen kümmern zu müssen.
# 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
Die Wahl der Verwendung hängt die CSV-Bibliothek oder etwas strenger nur auf die Sie die Datei sendet und ob sie erwarten den strengen TSV Standard einzuhalten.
Details zu dem TSV-Standard können bei http://en.wikipedia.org/wiki/Tab-separated_values
Bitte fügen Sie Code-Snippets mit der Antwort ein, * nicht * in einem externen Text. Dieser Punkt scheint jetzt zu sein, was sehr schade ist. –
@JezenThomas danke für die heads-up. Ich habe alle Code-Beispiele inline gezogen, um das Problem zu beheben, dass ich die gist – mmmries
große Antwort betrachten muss. . Ich bin überrascht, wie schrecklich '\ d' mit dem CSV-Parser fehlschlägt. – dps
Ich mag mmmries Antwort zu finden. JEDOCH hasse ich die Art und Weise, wie Ruby irgendwelche leeren Werte vom Ende einer Spaltung entfernt. Es wird auch nicht die Zeilenschaltung am Ende der Zeilen entfernen.
Außerdem hatte ich eine Datei mit möglichen Zeilenumbrüchen in einem Feld. Also schrieb ich seine ‚Parse‘ wie folgt:
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
Diese verkettet alle Zeilen wie nötig eine komplette Linie von Daten zu erhalten, und gibt immer den vollen Satz von Daten (ohne Potential null Einträge am Ende).
- 1. Die beste Methode zum Analysieren einer Tabelle in Ruby
- 2. Lese Datensätze aus einer Datei durch Tabulatoren
- 3. Wie analysiert man eine durch Tabulatoren getrennte Textzeile in Ruby?
- 4. Was ist die sicherste Methode zum Hochladen einer Datei?
- 5. Was ist das beste Tool zum Analysieren von Protokolldateien?
- 6. Die beste Methode zum Floaten?
- 7. Was ist die beste Methode zum Laden einer URL aus einer JSON-Liste in JQuery/Javascript
- 8. Die beste Methode zum Analysieren von DateTime zu SQL Server
- 9. Was ist die beste Methode zum Speichern/Berechnen von Benutzerbewertungen?
- 10. Suchen und Bearbeiten von Werten in einer durch zwei Tabulatoren getrennten Textdatei python 3
- 11. Was ist die beste Methode zum Generieren eines API-Referenzdokuments mithilfe einer Rails routes.rb-Datei?
- 12. Was ist die beste Methode zum Einstellen von Bildquellen?
- 13. Was ist die beste Methode zum Aufräumen von CSS?
- 14. Was ist die beste Methode zum dynamischen Sandbox-Inline-JavaScript?
- 15. Was ist die beste Methode zum Indizieren von eindeutigen Textfeldern?
- 16. Was ist die beste Methode zum Erstellen von ClickOnce-Bereitstellungen?
- 17. optimale Methode zum Analysieren eines JSON-Objekts in einer Datei
- 18. R: Problem mit read.table Erkennung fehlender Werte in einer durch Tabulatoren getrennten Datei beim Aufruf von Spalten
- 19. Die beste Methode zum Generieren einer PDF aus einer Vorlage
- 20. Klassendesign/beste Methode zum Initialisieren einer Benutzerkonfigurationsdatei
- 21. Die beste Methode zum Lesen der ZIP-Datei in PHP
- 22. Beste Methode zum Verschieben einer hochgeladenen Datei in PHP?
- 23. Wie eine durch Tabulatoren getrennte Datei in kommagetrennte Datei
- 24. Methode zum Analysieren von HTML-Dokumenten in Ruby?
- 25. Was ist die beste Methode zum Erstellen einer Netzwerkpaketstruktur/Klasse in C#?
- 26. Was ist die pythischste Methode zum Angeben einer Konfigurationsdatei?
- 27. Was ist die beste Methode zum Überprüfen, ob eine Datei aus einer gespeicherten SQL Server 2005-Prozedur vorhanden ist?
- 28. Die beste Methode, Ruby-Code auf einer Webseite anzuzeigen?
- 29. Die beste Methode zum Sortieren einer ArrayList in Java
- 30. Was ist die beste Diff-Bibliothek in Ruby?
Beachten Sie, dass dieser Ansatz fehlschlägt, wenn einer der durch Tabulatoren getrennten Werte einen doppelten Anführungsstrich enthält. Der StrictTsv-Vorschlag in der anderen Antwort ist robuster. –