ubuntuusers.de

parsen von csv-Dateien

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

linuxbasher

(Themenstarter)

Anmeldungsdatum:
6. März 2010

Beiträge: 44

track schrieb:

noch Willkommen auf dem Forum !

Danke!

Sind die Felder in Deiner csv immer in Gänsefüßchen gekapselt ?
Und immer mit Komma getrennt, ohne Leerzeichen ?

Ja. Das Format wird von OpenOffice vorgegeben. Ich passe lediglich darauf auf, dass die Felder kein Komma enthalten. Sonst stolpert mein Skript.

Dann würde es doch ausreichen, wenn Du awk einsetzt, und das Trennsymbol auf "," festlegst.
Dann noch das " am Anfang und am Ende gelöscht, und die Felder stehen ganz brav in den Feldern $1, $2, usw. von awk

Naja, fast so mache ich es ja auch.

Mein Skript ist etwas komplexer, weil ich für die verschiedenen Elemente der HTML-Ausgabe veränderbare HTML-Vorlagen erlaube. Ich nutze es nämlich auch noch für andere Zwecke.

@Hello World: Dein Ton gefällt mir nicht. Deine Aussage:

Ich habe keinen Plan von Perl

und das von dir aus dem Stehgreif erstellte Skript stehen im Widerspruch miteinander. Ich bitte dich um Verständnis, dass mir diese OOP-artige Syntax von Perl noch fremd ist.

Zusammenfassend stelle ich fest, dass es wohl keine einfache Lösung unter bash und awk gibt, um csv-Dateien mit allem Schnickschnack richtig zu parsen. Ansonsten dank an alle für den Hinweis auf das Perlmodul.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Wenn die Quelle eine eigene OpenOffice-Datei ist, dann würde ich mit Feldtrenner ; exportieren, und darauf achten selbst kein ; zu verwenden.

adun Team-Icon

Avatar von adun

Anmeldungsdatum:
29. März 2005

Beiträge: 8606

linuxbasher schrieb:

Weil die bash selbst das Quoten gut beherrscht

Was die Bash gut beherrscht muss noch erfunden werden. Das ist ein Fall wo man unbedingt eine Bibliothek benutzen sollte. Die Regeln wie eine CSV auszusehen hat, sind zwar übersichtlich, aber alle Fälle wie "Anführungszeichen im Eintrag" mit sed und awk abzudecken ist sowohl nervig als auch fehleranfällig.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env ruby

require 'rubygems'
require 'fastercsv'
require 'haml'

adresses = FasterCSV.read "adressen.csv"
template = ""
adresses.each do |adress|
  template << '.adresses '
  adress.each do |entry|
    template << entry + " / "
  end
  template << "\n"
end
puts Haml::Engine.new(template).render  

Kommt sowas bei raus:

<div class='adresses'>Meier, Heinz / Straße / 12345 Stadt /</div>
<div class='adresses'>Kunze, Frank / Straße / 12345 Stadt /</div>

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

linuxbasher schrieb:

Deine Aussage:

Ich habe keinen Plan von Perl

und das von dir aus dem Stehgreif erstellte Skript stehen im Widerspruch miteinander.

Nicht wirklich. Das Script habe ich mir mittels meiner Kenntnisse anderer, verwandter Programmiersprachen und der Dokumentation im CPAN zusammengereimt, und einige Sachen, wie z. B. die Syntax \*STDIN musste ich mir auch erst ergooglen. Ja, über die Jahre hab ich vielleicht das eine oder andere mal einen Blick in ein Perl-Script geworfen und vielleicht hier im Forum das eine oder andere darüber aufgeschnappt, aber echte Perl-Kenntnisse besitze ich nicht.

Ich bitte dich um Verständnis, dass mir diese OOP-artige Syntax von Perl noch fremd ist.

Das nimmt Dir ja niemand krumm. Aber ein Modul als "Overkill" zu bezeichnen, obwohl es nur in drei Zeilen in meinem Script verwendet wird, das erscheint mir doch etwas merkwürdig.

Zusammenfassend stelle ich fest, dass es wohl keine einfache Lösung unter bash und awk gibt, um csv-Dateien mit allem Schnickschnack richtig zu parsen. Ansonsten dank an alle für den Hinweis auf das Perlmodul.

Ich würde Dir raten, Dir richtige Perl-Kenntnisse anzueignen. Oder auch Python, Ruby oder sonstwas. bash ist einfach keine ernstzunehmende Sprache für irgendwas, das über das Absetzen von ein paar Shell-Befehlen hinausgeht.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Hier mal mein Python Vorschlag mit der jinja2 Template Engine. Als Parameter einfach die CSV-Datei übergeben.

Was mich hier (mal wieder) richtig genervt hat ist das ätzende CSV-Modul der Standard-Lib. Der fehlende Unicode-Support ist imho extrem ätzend. Zudem habe ich es nicht auf Reihe bekommen, die " wegzubekommen. Da scheine ich die Dialekt-Klasse nicht verstanden zu haben. (Würde mich da ja über ein Beispiel damit freuen) Nuja, evtl. ist das bei Python3 ja verbessert worden.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

@Lysander: Das mit dem csv-Modul und den " kann ich nicht nachvollziehen!? Das geht normalerweise automatisch. Vielleicht liegt's an der Dialekt-Klasse, die habe ich noch nie benutzt, aber dann müsstest Du mal zeigen was Du damit gemacht hast.

1
2
3
4
5
6
7
8
In [7]: f = open('test.csv', 'rb')

In [8]: r = csv.reader(f)

In [9]: r.next()
Out[9]: ['Meier, Heinz', 'Stra\xc3\x9fe', '12345 Stadt']

In [10]: f.close()

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Das ätzend bezog sich eher auf den fehlenden Unicode-Support. Wegen der Anführungszeichen muss ich wohl noch mal gucken, was ich da verbrochen hatte. Hab den Code nicht mehr, aber kann es versuchen noch mal nachzuvollziehen.

Antworten |