Ausfüllen einer Template+CSV mit awk => Ziel-Datei

29/04/2015 - 11:13 von Celal Dikici | Report spam
Hallo Gruppe,

Hier ist eine Software, dass mittels einer Import-Beschreibung (KIMP) Daten in eine DB importieren kann.

ACTION "INS"
#-- Header --
ExecuteProcs Y
SetDefaultValues Y

#-- Daten --
TBL XyzDeals
Status "V"
Type "D"
TradeDate "08/04/2015"
Amount 114810.00
EOT

#-- References --
Users.Ref "SST"
EOR


Ich erstelle diese KIMP-Datei aktuell mit Daten aus einer CSV-Datei, in dem ich wie folgt vorgehe

tail +2 ${CSVFile} | grep -v "^#" | grep -v "^$" | while read CSVZeile
do
# Zaehler hochzaehlen
COUNTER=`expr ${COUNTER} + 1`
# Spalte 01: Deal_Id
Deal_Id=`echo ${CSVZeile} | nawk -F";" '{ print $1 }' | tr -d [:blank:]`
# Spalte 05: Type
Type=`echo ${CSVZeile} | nawk -F";" '{ print $5 }' | tr -d [:blank:]`
...cut...
# Info
echo `date` "INFO" "Record ${COUNTER}: Id = ${Deal_Id}"

# Jetzt INSert File bauen
echo "### Record: ${COUNTER}" >> ${IMPFile}
echo "ACTION" \"INS\" >> ${IMPFile}
...cut...
echo "TBL XyzDeals" >> ${IMPFile}
echo "Status" \"V\" >> ${IMPFile}
echo "Type" \"${Type}\" >> ${IMPFile}
echo "TradeDate" \"${TradeDate}\" >> ${IMPFile}
echo "Amount" ${Amount} >> ${IMPFile}
echo "EOT" >> ${IMPFile}
...cut...
done



==> diese Vorgehensweise ist zwar straight forward,
aber bei über 3000 Zeilen in der CSV-Datei doch etwas langsam..und..

Die CSV-Datei wird mittels einer SQL-Report erstellt. Und dieser SQL-Report ist stàndig in Bewegung, weil dessen Ergebnisse auch von anderen gebraucht werden.
Daher enthàlt er auch mehr Felder, als ich in meinem Shell-Script benutze. Und auch die Reihenfolge der Felder àndert sich immer wieder mal.

==> d.h. ich muss jedesmal nach Feldreihenfolgen-Änderung mein Shell-Script anpassen und die nawk-Feldernummern wieder richtig biegen.

Daher möchte ich die KIMP-Datei Erstellung anders gestalten. Am liebsten wàre mir folgendes:

1) Ich erstelle eine KIMP-File als Template mit Platzhaltern; z.B.

...cut...
Status "V"
Type "${Type}" oder Type "##Type##"
...cut...


2) die Platzhalter, die ich benutze sind identisch mit den Spaltentiteln in der CSV-File, also

Deal_Id;;;;Type;TradeDate;Amount;;...cut...;Users.Ref;...cut...


3) ein AWK-Script nimmt dieses Template und ersetzt die Platzhalter mit den Werten aus der CSV-Datei


==> diese Vorgehensweise wàre schnell und ich könnte mein Template erweitern, den SQL-Report erweitern und/oder anpassen, Spalten vertauschen aber müsste den Shell-Script
nicht jedesmal anfassen, also CSV + Template ==> KIMP



Wie sàhe also so ein AWK-Script aus, dass Platzhalter mir Spaltentiteln matched, ohne dass ich die Spaltennummern jedesmal neu definieren mus?




Hat einer eine Idee?

viele Grüße,
Celal
 

Lesen sie die antworten

#1 Tim Landscheidt
29/04/2015 - 17:45 | Warnen spam
Celal Dikici wrote:

[...]

> Wie sàhe also so ein AWK-Script aus, dass Platzhalter mir Spaltentiteln matched, ohne dass ich die Spaltennummern jedesmal neu definieren mus?

Hat einer eine Idee?



Natürlich: Wahlweise zu Perl oder Python greifen, und dort
von einem der gut abgehangenen CSV-Module Gebrauch ma-
chen. Dann bekommst Du richtige Datenstrukturen und bist in
drei Minuten fertig.

Tim

Ähnliche fragen