Moin zusammen, ein Kollege hat ein Problem an mich herangetragen, das ich nicht so "einfach" und "elegant" zu lösen weiss: Gegebenn ist eine Datei mit Datensätzen in der Form: data1|data2|ary1{data3|data4|data5}|ary2{data6|data7}|data8 d.h. die einzelnen Felder sind durch "|" getrennt; ein einzelner Datensatz kann allerdings wieder ein "Array" sein, dessen einzelne Element durch "|" getrennt werden. Ein Einlesen im Shell-Skript mit IFS='|' set -a array $data splitted gnadenlos bei _allen_ Pipe Zeichen. Wie bekomme ich das hin, das ary1 und ary2 zu einem Feldelement werden? (Die Pipesymbole innerhalb von {} könnten dabei durch anderee Zeichen ersetzt werden) Ideen? Andreas -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Donnerstag, 7. Juli 2011, 11:05:55 schrieb Kyek, Andreas, VF-DE:
Moin zusammen,
ein Kollege hat ein Problem an mich herangetragen, das ich nicht so "einfach" und "elegant" zu lösen weiss:
Gegebenn ist eine Datei mit Datensätzen in der Form:
data1|data2|ary1{data3|data4|data5}|ary2{data6|data7}|data8
d.h. die einzelnen Felder sind durch "|" getrennt; ein einzelner Datensatz kann allerdings wieder ein "Array" sein, dessen einzelne Element durch "|" getrennt werden.
Ein Einlesen im Shell-Skript mit
IFS='|' set -a array $data
splitted gnadenlos bei _allen_ Pipe Zeichen.
Wie bekomme ich das hin, das ary1 und ary2 zu einem Feldelement werden? (Die Pipesymbole innerhalb von {} könnten dabei durch anderee Zeichen ersetzt werden)
Ideen?
Andreas
Vielleicht gibt es ja noch viel elegantere Lösungen, aber ich glaube, ich würde diese Zeilen zuerst mit einer einfachen Umwandlung/Ersetzung aufbrechen und in eine named pipe oder zur besseren Kontrolle sogar in eine Zwischendatei schreiben: data1|data2 ary1{data3|data4|data5} ary2{data6|data7} data8 # Von da aus könnte man dann mit while read in das Skript einlesen und weiter zerlegen, wobei das # jeweils das Ende eines Datensatzes bezeichnet. Vielleicht bringt dich das ja auf eine brauchbare Fährte. Auch Perl kann so etwas meines Wissens recht gut; aber da bin ich programmiertechnisch überfragt. Jürgen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Andreas Am 07.07.2011 11:05, schrieb Kyek, Andreas, VF-DE:
Moin zusammen,
ein Kollege hat ein Problem an mich herangetragen, das ich nicht so "einfach" und "elegant" zu lösen weiss:
Gegebenn ist eine Datei mit Datensätzen in der Form:
data1|data2|ary1{data3|data4|data5}|ary2{data6|data7}|data8
d.h. die einzelnen Felder sind durch "|" getrennt; ein einzelner Datensatz kann allerdings wieder ein "Array" sein, dessen einzelne Element durch "|" getrennt werden.
Ein Einlesen im Shell-Skript mit
IFS='|' set -a array $data
splitted gnadenlos bei _allen_ Pipe Zeichen.
Wie bekomme ich das hin, das ary1 und ary2 zu einem Feldelement werden? (Die Pipesymbole innerhalb von {} könnten dabei durch anderee Zeichen ersetzt werden)
Ideen? Python ?
import re s = """data1|data2|ary1{data3|data4|data5}|ary2{data6|data7}|data8""" print re.findall("(?:^|\|)([^\|]+?\{[^\{]+\}|[^\|\{]+)",s) ['data1', 'data2', 'ary1{data3|data4|data5}', 'ary2{data6|data7}', 'data8'] Gruß Werner -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo! Ein Lösungsansatz: echo "data1|data2|ary1{data3|data4|data5}|ary2{data6|data7}|data8" | sed ' { s/ary.{/{/g; s/[{}]/#/g; s/|#/\n#/g; s/#|/#\n/g }' | sed ' /#/ { s/|/:/g; s/#//g } ' | sed ' s/|/\n/g ' data1 data2 data3:data4:data5 data6:data7 data8 Oder ist das, was Andreas wollte? Gruß Kimmo -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (4)
-
Juergen Langowski
-
K. Elo
-
Kyek, Andreas, VF-DE
-
Werner Tietz