Daten zeilenweise einlesen

  • Ersteller blueunderground
  • Erstellt am
blueunderground

blueunderground

Mitglied
Hallo,

möchte mit der bash ein skript bauen mit dem ich zeilenweise Datensätze einlesen und später verarbeiten kann.

datensatz.txt
<Artikelnummer>123</Artiklenummer>
<Artikelname>Holzkiste</Artiklename>
<Preis>12,50</Preis>
<Waehrung>EUR</Waehrung>
<Artikelnummer>155</Artiklenummer>
<Artikelname>Bauklotz</Artiklename>
<Preis>12,50</Preis>
<Waehrung>EUR</Waehrung>
<Artikelnummer>777</Artiklenummer>
<Artikelname>Holzkiste</Artiklename>
<Preis>9,20</Preis>
<Waehrung>EUR</Waehrung>
<Artikelnummer>456</Artiklenummer>
<Artikelname>Schublade</Artiklename>
<Preis>10,00</Preis>
<Waehrung>USD</Waehrung>


Nun möchte ich jeden Datensatz seperat einlesen, die Zuordnun Anfang/Ende des Datendatzes wäre immer die Artiklnummer, wie bekomme ich das hin (Array) ???

Würde später gerne eine Ausgabe haben in dem ich die Artikelnummer angeben und den Datensatz ausgeben lassen.


Danke für die Hilfe.

Blue
 
naja jeweils 4 zeilen machen einen datensatz aus, das sollte ja nicht so schwer sein. hast du irgendwelche konkreten fragen?
zum einstieg kannst mal den folgende code verwenden, er liest die datei ein und ermittelt den jeweiligen wert
Code:
while read zeile; do
  value=${zeile%<*};value=${value#*>}
  echo $value
done<datensatz.txt
den ermittelten wert stellst du dann in den passenden array; ist es eine artikelnummer dann in den artikelnummer array usw.
 
Hi ninguno,

erstmal Danke für deine Antwort.
Erstmal vorweg, habe noch nicht mit Arrays gearbeitet.

Ich würde das ganze so haben.
in meinem Aufruf würde ich ein Parameter ($1) übergeben , dies ist dann die Artnr. z.b 777

./einlesen.sh 777

Somit würde ich dann gerne mit den Daten aus dem bestimmten Datensatz arbeiten sprich:

777
Holzkiste
9,20
EUR

davon würde ich gerne den Preis und Waehrung haben wollen, vielleicht so:


./einlesen.sh 777 preis waehrung

Ausgabe:
777 9,20 EUR

Ich denke Du hast das vom Grundgedanke verstanden :-)
Danke
 
blueunderground schrieb:
Erstmal vorweg, habe noch nicht mit Arrays gearbeitet.
okay dann hast du dir ja jetzt sicher schon angeschaut wie das geht. zuweisung an array ist ganz einfach
Code:
artikelnummer[$satzno]=$value;
echo ${artikelnummer[$i]}
hast du noch konkrete fragen?
 
Hallo

Hier wirst du nur mit sinnlosen Klimmzügen an einem Array vorbeikommen.
Einmal fängt ja jeder an, warum nicht gleich an diesem exemplarischen Beispiel?

Aber um deine Daten in eine bessere Blockform zu bringen, kannst du diese ja erstmal in einer zeile sammeln.

So auf die Schnelle mit sed:
Code:
sed -ne '/^<Artikelnummer/!H;/^<Artikelnummer/x;s/\n/ /gp' datensatz.txt
[i]<Artikelnummer>123</Artiklenummer>      <Artikelname>Holzkiste</Artiklename>    <Preis>12,50</Preis>    <Waehrung>EUR</Waehrung>
<Artikelnummer>155</Artiklenummer>      <Artikelname>Bauklotz</Artiklename>     <Preis>12,50</Preis>    <Waehrung>EUR</Waehrung>
<Artikelnummer>777</Artiklenummer>      <Artikelname>Holzkiste</Artiklename>    <Preis>9,20</Preis>     <Waehrung>EUR</Waehrung>


[/i]
Bringt erstmal die zusammengehörigen Blöcke in eine Zeile wobei die xml-Tags durch Tab getrennt werden.
Die Ausgabe lasst sich dann einfach in eine while read Schleife einlesen.
Dann kannst du die Varablen auf den Parameternamen testen und mittels Variablenexpansion den Inhalt ausgeben.
Wenn die Datensätze immer die gleiche Reihenfolge haben, kannst du die in der while read Schleife auch gleich direkt zuweisen und gegebenenfalls den <Tagbezeichner> mittels sed oder perl entsorgen.
Ist allerdings etwas fehlerträchtig, wenn die Daten nicht konsistent sind.
Thats all folks.

Mit Array und oder gleich Hash mit perl, bist du natürlich variabler.
HTH
Gruß Wolfgang
 
Zuletzt bearbeitet:
Zurück
Oben