Einfache Datenspeicherung mit Ruby

Für Datenspeicherung ist nicht immer ein vollständiges RDBMS wie PostgreSQL erforderlich. Oft zählt "klein aber fein" mehr. Plain-Text-Datenformate sind mit den richtigen Bibliotheken möglicherweise sogar einfacher zu nutzen.

Bei einem Großteil der Software-Entwicklung geht es heute um eine benutzerfreundliche Oberfläche für eine massive SQL-Datenbank. Dieses Entwicklungsmuster – manchmal auch als CRUD-Anwendungen bezeichnet (Create, Read, Update, Delete) – ist so dominierend geworden und in vielerlei Hinsicht ein derartig gut gelöstes Problem, dass es niemandem einfällt, einmal etwas anderes zu machen. In Wirklichkeit ist ein SQL-Datenbank-Managementsystem mit zahlreichen Funktionen wie zum Beispiel PostgreSQL in vielen Anwendungsszenarien ein immenser Overkill, etwa mit Kanonen auf Spatzen zu schießen. Für einfachere Tools ist eine simplere Herangehensweise an die Datenspeicherung möglicherweise besser geeignet.

Einer der Vorteile der Verwendung einfacherer Methoden zur Datenspeicherung ist, dass sie häufig mit Plain-Text-Speicherung arbeiten, das heißt, es ist relativ einfach, die Daten in einem Texteditor zu lesen, und man muss nicht komplexe Software, etwa pgAdmin verwenden.

CSV

Eins der bekanntesten Plain-Text-Datenformate, die regelmäßig verwendet werden, ist das Comma Separated Value (oder CSV)-Format. Es ist nichts anderes als Plain-Text, wobei jede Zeile ein Datensatz, eine Zeile oder ein Tupel (je nach dem bevorzugten Jargon) ist, und jeder Datensatz wird durch Kommas in Felder, Spalten oder Elemente aufgeteilt. Das ist sehr praktisch zum Speichern von Tabellendaten ohne komplexe Datenbank-Engine – das heißt, um Daten in einem speicherbaren Format darzustellen, das den Merkmalen einer zweidimensionalen Tabelle entspricht. So lange in keinem Feld ein Komma benötigt wird, ist programmiertechnisch das Parsen von CSV-Daten völlig einfach. Wenn in einigen Feldern Kommas vorhanden sind, muss das Datenformat ein anderes Trennzeichen als Kommas verwenden, etwa ein Escape-Zeichen oder ein Anführungszeichen. Je nachdem, wie komplex die Daten werden, ist möglicherweise mehr als eine dieser Lösungen erforderlich.

In seiner einfachsten Form kann CSV Textzeilen wie die folgende enthalten:

Perrin,Chad,Einfache Datenspeicherung mit Ruby,Programmieren
Perrin,Chad,Besprechung: Das beste Linuxbuch überhaupt,Open Source
Perrin,Chad,Leute zur Verwendung starker Passwörter motivieren,Security

Für Werte in Anführungszeichen würde dies in einer Zeile derselben Datei folgendermaßen aussehen:

Perrin,Chad,”NetworkManager, der fünfte Reiter der Apocalinux”,Open Source

Das Gleiche kann man aber auch mit einem Escape-Zeichen erzielen:

Perrin,Chad,NetworkManager, der fünfte Reiter der Apocalinux,Open Source

In Fällen, in denen das Feldtrennzeichen auch in den Daten vorkommen könnte, wäre es das Einfachste, ein anderes Zeichen als Feldtrennzeichen zu wählen – eines, von dem man weiß, dass es in den Daten selbst nicht vorkommt. In manchen Fällen könnte dies ein Semikolon sein, in anderen könnte es ein Carat oder ein Tabulator sein. Die Verwendung von Tabulatoren ist inzwischen so verbreitet, dass sie zur Entstehung ihres eigenen Initialwortes ähnlich wie CSV geführt hat: Das Format heißt Tab Separated Values (oder TSV). Mit Bezug auf die anderen Zeichenarten sind manche dazu übergegangen, CSV ein “Character Separated Value”-Format zu nennen.

Eine clevere Weise, CSV-Dateien zu handhaben, ist in den meisten Fällen, Code zu verwenden, der nach Bedarf Daten in und aus dem Format übersetzt, und die Daten niemals selbst mit der Hand in einem Texteditor zu bearbeiten. Aus diesem Grund und wegen der Vorherrschaft des CSV-Datenformats (häufig als Exportformat für SQL-Datenbanken und Arbeitsblätter verwendet) bietet fast jede moderne Programmiersprache eine ziemlich standardmäßige Implementierung einer CSV-Bibliothek und zumindest einige alternative Implementierungen. Ruby macht hier keine Ausnahme, und seine Standardbibliothek bietet eine CSV-Klasse:

#!/usr/bin/env ruby
require 'csv'

articles = [
  [
    'Perrin',
    'Chad',
    'Einfache Datenspeicherung mit Ruby',
    'Programmieren'
  ],
  [
    'Perrin',
    'Chad',
    'Besprechung: Das beste Linuxbuch überhaupt',
    'Open Source'
  ],
  [
    'Perrin',
    'Chad',
    'NetworkManager, der fünfte Reiter der Apocalinux',
    'Open Source'
  ]
]
CSV.open('articles.csv', 'w') do |csv|
articles.each {|record| csv << record }
end

Dies ergibt eine Datei, die die folgenden Daten enthält:

Perrin,Chad,Einfache Datenspeicherung mit Ruby,Programmieren
Perrin,Chad,Besprechung: Das beste Linuxbuch überhaupt,Open Source
Perrin,Chad,”NetworkManager, der fünfte Reiter der Apocalinux”,Open Source

Daten wie diese in ein Ruby-Programm einzulesen ist genauso einfach:

#!/usr/bin/env ruby
require 'csv'

articles = Array.new

CSV.foreach('articles.csv') do |record|
articles << record
end

Wenn man davon ausgeht, dass die Datei articles.csv in diesem Beispiel die gleiche Datei wie im vorigen Beispiel ist, wird eine Artikelaufstellung erzeugt, die genau die gleichen Daten enthält wie die Artikelaufstellung im vorangehenden Beispiel.

YAML

Ein anderes Plain-Text-Datenformat ist YAML, das etwa wie “camel” ausgesprochen wird. Ursprünglich hieß es, YAML sei ein Akronym für “Yet another Markup Language” (“Noch eine Markup-Sprache”), aber mit der voranschreitenden YAML-Entwicklung wurde die Sprache komplexer, ihre Verwendung weitete sich über die ursprünglichen Zwecke hinaus aus und Entwickler benannten sie in “YAML Ain’t Markup Language” um. In seiner einfachsten Form ist YAML ein Plain-Text-Format für die Darstellung von zwei Datentypen: benannte Elemente und unbenannte Listenelemente.
In der Ruby-Gemeinde wurde YAML so etwas wie ein De-facto-Standard für das Datenmarshalling – ein Fantasiename für die Übersetzung von Daten im Arbeitsspeicher in ein Format, das für die Speicherung und den Austausch mit anderen Programmen geeignet ist, wie man das auch mit Daten im CSV-Format macht. YAML ist kein perfektes Format:

  • Für die meisten Zwecke, für die es verwendet wird, ist die Komplexität des Formats ein Fall von Overkill (wenn auch nicht ganz so schlimm wie bei einer relationalen SQL-Datenbank). In der Tat betrachtet cat-v.org YAML aus genau diesem Grund als “schädlich”.
  • YAML nutzt für große Teile seiner Syntax bedeutungsvolle Leerzeichen, und in manchen Kreisen werden syntaktisch bedeutungsvolle Leerzeichen als schädlich betrachtet.
  • Die Performance der unterschiedlichen YAML-Implementierungen variiert erheblich, leidet aber einfach aufgrund der Komplexität der Sprachspezifikation. Schlimmer noch, die Implementierung von YAML in der Ruby 1.8-Standardbibliothek (mit der Syck-Engine) ist wahrscheinlich die langsamste Implementierung von Bedeutung, die es in Ruby gibt, auch wenn sie durch eine schnellere Implementierung in der Ruby 1.9-Standardbibliothek abgelöst wird (mit der Psych-Engine). Die Hauptgründe für die Ablösung von Syck scheinen ein Mangel an ständiger Pflege zu sein, seit ihr Schöpfer verschwunden ist, und Fehlerhaftigkeit.

YAML bietet einige Vorteile, die dazu beitragen, dass die Sprache beliebt bleibt:

  • Es gibt durchaus einige Implementierungen, die zumindest den Mangel an Auswahl als Grund für die Verwendung von etwas anderem eliminieren – auch wenn das nicht gerade ein Vorteil gegenüber anderen verbreiteten Formaten ist.

  • Im Vergleich zu konkurrierenden Formaten wie CSV, JSON und XML (nach aufsteigendem Schwierigkeitsgrad der Lesbarkeit des Formats mit dem Auge), ist es im Allgemeinen für Menschen einfacher schnell zu lesen und zu verstehen.
  • Viele YAML-Dateien sehen tatsächlich am Ende sehr wie die Syntax von Markup-Sprachen wie etwa Markdown aus, was bedeutet, dass für bestimmte begrenzte Zwecke die Formate als austauschbar behandelt werden können.

Die Nutzung der YAML-Bibliothek in Ruby ist ungefähr so einfach wie die Verwendung einer CSV-Bibliothek:

#!/usr/bin/env ruby
require 'yaml'

articles = [
  [
    'Perrin',
    'Chad',
    'Einfache Datenspeicherung mit Ruby',
    'Programmieren'
  ],
  [
    'Perrin',
    'Chad',
    'Besprechung: Das beste Linuxbuch überhaupt',
    'Open Source'
  ],
  [
    'Perrin',
    'Chad',
    'NetworkManager, der fünfte Reiter der Apocalinux',
    'Open Source'
  ]
]
File.open('articles.yaml', 'w') do |out|
  YAML.dump articles, out
end

Dies erzeugt eine Datei namens articles.yaml, die die folgenden Daten enthält:

---
- - Perrin
  - Chad
  - Einfache Datenspeicherung mit Ruby
  - Programmieren
- - Perrin
  - Chad
  - "Besprechung: Das beste Linuxbuch überhaupt"
  - Open Source
- - Perrin
  - Chad
  - NetworkManager, der fünfte Reiter der Apocalinux
  - Open Source

Das Einlesen von Daten aus einer Datei wie articles.yaml in eine articles ist sogar noch leichter:

#!/usr/bin/env ruby
require 'yaml'

articles = YAML.load_file('articles.yaml')

Durch die Verkettung von CSV- und YAML-Operationen ist es eine leichte Übung, eine YAML-Datei zu erstellen, die die gleichen Daten darstellt wie eine CSV-Datei, oder umgekehrt. Für Anwendungen, die Permanentdatenspeicher benötigen, die nicht zu groß und nicht zu komplex sind, sind CSV und YAML lesbare Plain-Text-Formate, und Rubys CSV- und YAML-Bibliotheken bieten einen einfachen programmiertechnischen Zugriff auf diese Formate.

Neueste Kommentare 

Noch keine Kommentare zu Einfache Datenspeicherung mit Ruby

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *