Re: [vz-users] Probleme mit Zeilenumbruch in einem Import-Script

2016-12-30 Diskussionsfäden D. Greulich
Hallo Lars,

vielen Dank für deine Hilfe und Hinweise im Bezug auf das Script.

Ich habe nun meine fehlenden Kanäle ergänzt und bin mit dem Ergebnis sehr
zufrieden.



Mit freundlichen Grüßen
Dennis Greulich

---

Am 30. Dezember 2016 um 11:01 schrieb Andreas Goetz :

> Na wie derm auch sei- ich fand den Exkurs in die Shellprogrammierung sehr
> hillfreich- bei mir ists leider meist trial and error- zumindest kenne ich
> mittlerweile einige Stellen an denen ich rumprobieren kann :)
>
> Vielen Dank an Lars und Euch alles einen Guten Rusch und ein Gesundes und
> Erfolgreiches 2017!
>
> Viele Grüße,
> Andreas
>
>
> 2016-12-30 10:31 GMT+01:00 Josef Moellers :
>
>> On 29.12.2016 23:15, Lars Täuber wrote:
>> > Hallo Dennis,
>> >
>> > ich bin beim Formulieren von Antworten etwas ungeschickt. Bitte fasse
>> die Mail nicht als Belehrung auf.
>> > Ich schreibe mal, ein paar Grundbemerkungen auf und dann eine Lösung,
>> wie ich es machen würde.
>> >
>> > * Konvention in Shellskripten: Endung auf .sh; lassen sich so besser
>> von AWK-Skripten (*.awk) usw. unterscheiden
>> So etwas hat neulich schon jemand anders behauptet (oder war's in einem
>> Forum?) und hier möchte ich mich mal einmischen und ein "Veto!"
>> aussprechen:
>>
>> Es ist egal, ob "import" ein übersetztes Hochsprachen-Programm, ein
>> Skript in welcher Sprache auch immer (Shell, AWK, PERL, Python,
>> younameitwegotit) oder gar nur eine Shell-Funktion ist: hauptsache es
>> tut seine Pflicht. Es ist eine "Black Box". Klar, wenn ich das Programm
>> modifizieren will und " import" aufrufe, könnte ich ein
>> Problem bekommen, aber das Problem ist meist schnell lösbar.
>>
>> Umgekehrt wird aber ein Schuh' 'draus: Wenn ich "import" als "import.sh"
>> (oder "import.awk" oder "import.pl") benenne und es an zahllosen Stellen
>> aufrufe, was mache ich, wenn ich feststelle, daß es als Skript zu
>> langsam ist und es in eine Compilersprache neu implementiere? Dann muß
>> ich *alle* Stellen suchen, wo "import.sh" aufgerufen wird und es dort
>> durch "import" ersetzen. Klar, ich kann an den Stellen, an denen es
>> nicht weh tut, die alte Version benutzen, dann habe ich aber *zwei*
>> Versionen des selben programms und muß *beide* pflegen!
>>
>> Die Urväter von Un*x haben sich etwas dabei gedacht, *nicht* auf
>> Dateiendungen zu setzen sondern auf den Inhalt, und auf den kommt's
>> bekanntlich an. Der Inhalt identifiziert sich selber durch die ersten
>> paar Bytes: "\177ELF" oder "#!". Windows zieht sich da aus der Affäre,
>> indem es automagisch Dateiendungen probiert, bis eine paßt, aber was,
>> wenn sich irgendwie plötzlich ein BAT-File vor ein COM-File setzt (oder
>> umgekehrt, ich nutze Windows nicht, kenne mich da in der Reihenfolge
>> nicht aus)?
>>
>> Zu guter Letzt führt es zu Verwirrung, wenn es in einem Verzeichnis
>> (z.B. den diversen "bin"-Verzeichnissen) sowohl ein "import.sh" als auch
>> ein "import.awk" , ein "import.pl" und ein "import.bash" gibt.
>>
>> Guten Rutsch!
>>
>> Josef, 35 Jahre Informtiker-Erfahrung in die Waagschale werfend.
>>
>
>


Re: [vz-users] Probleme mit Zeilenumbruch in einem Import-Script

2016-12-30 Diskussionsfäden Andreas Goetz
Na wie derm auch sei- ich fand den Exkurs in die Shellprogrammierung sehr
hillfreich- bei mir ists leider meist trial and error- zumindest kenne ich
mittlerweile einige Stellen an denen ich rumprobieren kann :)

Vielen Dank an Lars und Euch alles einen Guten Rusch und ein Gesundes und
Erfolgreiches 2017!

Viele Grüße,
Andreas


2016-12-30 10:31 GMT+01:00 Josef Moellers :

> On 29.12.2016 23:15, Lars Täuber wrote:
> > Hallo Dennis,
> >
> > ich bin beim Formulieren von Antworten etwas ungeschickt. Bitte fasse
> die Mail nicht als Belehrung auf.
> > Ich schreibe mal, ein paar Grundbemerkungen auf und dann eine Lösung,
> wie ich es machen würde.
> >
> > * Konvention in Shellskripten: Endung auf .sh; lassen sich so besser von
> AWK-Skripten (*.awk) usw. unterscheiden
> So etwas hat neulich schon jemand anders behauptet (oder war's in einem
> Forum?) und hier möchte ich mich mal einmischen und ein "Veto!"
> aussprechen:
>
> Es ist egal, ob "import" ein übersetztes Hochsprachen-Programm, ein
> Skript in welcher Sprache auch immer (Shell, AWK, PERL, Python,
> younameitwegotit) oder gar nur eine Shell-Funktion ist: hauptsache es
> tut seine Pflicht. Es ist eine "Black Box". Klar, wenn ich das Programm
> modifizieren will und " import" aufrufe, könnte ich ein
> Problem bekommen, aber das Problem ist meist schnell lösbar.
>
> Umgekehrt wird aber ein Schuh' 'draus: Wenn ich "import" als "import.sh"
> (oder "import.awk" oder "import.pl") benenne und es an zahllosen Stellen
> aufrufe, was mache ich, wenn ich feststelle, daß es als Skript zu
> langsam ist und es in eine Compilersprache neu implementiere? Dann muß
> ich *alle* Stellen suchen, wo "import.sh" aufgerufen wird und es dort
> durch "import" ersetzen. Klar, ich kann an den Stellen, an denen es
> nicht weh tut, die alte Version benutzen, dann habe ich aber *zwei*
> Versionen des selben programms und muß *beide* pflegen!
>
> Die Urväter von Un*x haben sich etwas dabei gedacht, *nicht* auf
> Dateiendungen zu setzen sondern auf den Inhalt, und auf den kommt's
> bekanntlich an. Der Inhalt identifiziert sich selber durch die ersten
> paar Bytes: "\177ELF" oder "#!". Windows zieht sich da aus der Affäre,
> indem es automagisch Dateiendungen probiert, bis eine paßt, aber was,
> wenn sich irgendwie plötzlich ein BAT-File vor ein COM-File setzt (oder
> umgekehrt, ich nutze Windows nicht, kenne mich da in der Reihenfolge
> nicht aus)?
>
> Zu guter Letzt führt es zu Verwirrung, wenn es in einem Verzeichnis
> (z.B. den diversen "bin"-Verzeichnissen) sowohl ein "import.sh" als auch
> ein "import.awk" , ein "import.pl" und ein "import.bash" gibt.
>
> Guten Rutsch!
>
> Josef, 35 Jahre Informtiker-Erfahrung in die Waagschale werfend.
>


Re: [vz-users] Probleme mit Zeilenumbruch in einem Import-Script

2016-12-30 Diskussionsfäden Josef Moellers
On 29.12.2016 23:15, Lars Täuber wrote:
> Hallo Dennis,
>
> ich bin beim Formulieren von Antworten etwas ungeschickt. Bitte fasse die 
> Mail nicht als Belehrung auf.
> Ich schreibe mal, ein paar Grundbemerkungen auf und dann eine Lösung, wie ich 
> es machen würde.
>
> * Konvention in Shellskripten: Endung auf .sh; lassen sich so besser von 
> AWK-Skripten (*.awk) usw. unterscheiden
So etwas hat neulich schon jemand anders behauptet (oder war's in einem
Forum?) und hier möchte ich mich mal einmischen und ein "Veto!" aussprechen:

Es ist egal, ob "import" ein übersetztes Hochsprachen-Programm, ein
Skript in welcher Sprache auch immer (Shell, AWK, PERL, Python,
younameitwegotit) oder gar nur eine Shell-Funktion ist: hauptsache es
tut seine Pflicht. Es ist eine "Black Box". Klar, wenn ich das Programm
modifizieren will und " import" aufrufe, könnte ich ein
Problem bekommen, aber das Problem ist meist schnell lösbar.

Umgekehrt wird aber ein Schuh' 'draus: Wenn ich "import" als "import.sh"
(oder "import.awk" oder "import.pl") benenne und es an zahllosen Stellen
aufrufe, was mache ich, wenn ich feststelle, daß es als Skript zu
langsam ist und es in eine Compilersprache neu implementiere? Dann muß
ich *alle* Stellen suchen, wo "import.sh" aufgerufen wird und es dort
durch "import" ersetzen. Klar, ich kann an den Stellen, an denen es
nicht weh tut, die alte Version benutzen, dann habe ich aber *zwei*
Versionen des selben programms und muß *beide* pflegen!

Die Urväter von Un*x haben sich etwas dabei gedacht, *nicht* auf
Dateiendungen zu setzen sondern auf den Inhalt, und auf den kommt's
bekanntlich an. Der Inhalt identifiziert sich selber durch die ersten
paar Bytes: "\177ELF" oder "#!". Windows zieht sich da aus der Affäre,
indem es automagisch Dateiendungen probiert, bis eine paßt, aber was,
wenn sich irgendwie plötzlich ein BAT-File vor ein COM-File setzt (oder
umgekehrt, ich nutze Windows nicht, kenne mich da in der Reihenfolge
nicht aus)?

Zu guter Letzt führt es zu Verwirrung, wenn es in einem Verzeichnis
(z.B. den diversen "bin"-Verzeichnissen) sowohl ein "import.sh" als auch
ein "import.awk" , ein "import.pl" und ein "import.bash" gibt.

Guten Rutsch!

Josef, 35 Jahre Informtiker-Erfahrung in die Waagschale werfend.


Re: [vz-users] Probleme mit Zeilenumbruch in einem Import-Script

2016-12-29 Diskussionsfäden Lars Täuber
Hallo Dennis,

ich bin beim Formulieren von Antworten etwas ungeschickt. Bitte fasse die Mail 
nicht als Belehrung auf.
Ich schreibe mal, ein paar Grundbemerkungen auf und dann eine Lösung, wie ich 
es machen würde.

* Konvention in Shellskripten: Endung auf .sh; lassen sich so besser von 
AWK-Skripten (*.awk) usw. unterscheiden

* Konvention in Shellskripten: Variablennamen in Großbuchstaben: 
"${DATEIEN[$I]}"

* Wenn man Dateien in Shellskripten als Option übergibt, sollte man darauf 
achten, dass evtl Sonderzeichen (z.B. Leerzeichen) im Dateinamen stecken 
können. Das kann im einfachsten Fall zu unerwünschten Ergebnissen erführen, im 
schlimmsten Fall aber auch zu gefährlichen Sicherheitslücken. Also Dateinamen 
_immer_ in Anführungszeichen: "${dateien[$i]}".
  Wenn man sich daran hält auch wenn es eigentlich nicht notwendig ist, da man 
die Dateinamen selbst wählt, vergisst man es aber auch in anderen Fällen nicht 
so einfach.

* überflüssige Programmaufrufe möglichst vermeiden:
*** cat "$DATEI" | sed -n ...
besser:
*** sed -n ... "$DATEI"

* Die Ausgabe durch 'sed 's/.../.../p' bewirken, dass das Ergebnis an die Shell 
übergeben wird. Die Interpretiert das ";" nach dem "ts=" als Trenner zwischen 
Befehlen. Du willst aber folgendes der Shell übergeben:
vzclient -u 5d485110-9908-11e6-8e35-ade5ad34c96a add data value=XX 
ts=$(date -d "2013-05-28 09:20:00" +" %s000")

Das $(befehl) bedeutet, dass die Shell den Befehl ausführen soll und die 
Ausgabe als String einfügen soll. Daraus entsteht also:
vzclient -u 5d485110-9908-11e6-8e35-ade5ad34c96a add data value=XX 
ts=136972560

Und das wird dann interpretiert.


* die verschiedenen Ausdrücke "[0-9]*.[0-9]*;" beim sed sind etwas zu 
umständlich. Kürzer geht es so: alle Zeichen nur kein ";":
[^;]*;

* Die Klammern um den letzten Ausdruck "(.*)" sind nicht notwendig, weil Du den 
Inhalt nicht auswerten möchtest.


* Der Umweg über das Shell-Array ist nicht notwendig, wenn die Dateien alle in 
einem Verzeichnis liegen. Auch möglich ist hier:
for DATEI in *
do
sed -n ... "$DATEI"
done


Ich bin mir nicht ganz sicher, was Du als Ergebnis erwartest, aber ich vermute 
in der ersten sed-Zeile soll der vierte Wert nach einem ";" als "value" 
genommen werden.

Man kann gut mit "cut" bestimmte Felder einer Datei extrahieren:
cut -d';' -f 2,4
oder kürzer, wenn man das ";" escaped:
cut -d\; -f 2,4
Das ";" wird sonst von der Shell interpretiert und nicht vom "cut"

Dann möchtest Du aber nur die Zeilen auswerten, die mit "600;" beginnen. Das 
kann man mit "sed" oder mit "grep" machen:
sed anweisen, dass es Zeilen, die mit "600;" anfangen nicht wegschmeißen soll:
sed -e '/^600\;/!d' -e 's/'  "$DATEI"

oder:
grep '^600;' | ...

Oder man nimmt die Datumsangabe als Kriterium.

Ein '\' am Ende einer Zeile zeigt der Shell, dass der Befehl auf der nächsten 
Zeile weiter geht.
In der Shellvariable "IFS" steht, welche Zeichen als Trennzeichen interpretiert 
werden sollen.
Normalerweise stehen das Leerzeichen, Tabulator und "Newline" drin. Aber man 
kann das auch selbst beeinflussen:
IFS=';'
trennt nun auch "2013-05-28 09:20:00;264802N203;1159" in 3 Teile:
2013-05-28 09:20:00
264802N203
1159


Also ich stell mir das so vor:

#!/bin/bash
#
# importiere Werte aus Logdateien
#

IFS=';'

for DATEI in id*
do
  grep ';201.-..-.. ' $DATEI \
  | cut -d\; -f2,4,8,9,10 \
  | while read DATUM P_AC WERT5 WERT6 WERT7
do
  DATUM=$(date -d "$DATUM" +%s000)
  vzclient -u 5d485110-9908-11e6-8e35-ade5ad34c96a add data value=$P_AC 
ts=$DATUM
  vzclient -u 681155e0-9906-11e6-b5d9-51edf01eb751 add data value=$WERT5 
ts=$DATUM
  vzclient -u 6fc360c0-9906-11e6-bc21-7becbbfe157b add data value=$WERT6 
ts=$DATUM
  vzclient -u 7664b9b0-9906-11e6-a73b-09873e88f0c0 add data value=$WERT7 
ts=$DATUM
done
done

Den Rest der Stellen war ich zu faul auszuzählen.
Jede Datei wird hier nur einmal mit grep, cut bearbeitet und jede Zeile nur 
einmal und dem read gelesen und auch nur ein "date" pro Zeile ausgeführt.
In Deiner Version wurde jede Datei für jeden Wert mehrfach geöffnet, bearbeitet 
und jedes mal das Datum neu berechnet.

Ich hoffe, das hilft Dir weiter.


Berthold Bredenkamp hat im Herbst 2011 ein Skript gebastelt:
http://volkszaehler.org/pipermail/volkszaehler-dev/attachments/2027/69cb6074/attachment.obj
welches ich für meine Importe angepasst habe.
Dort wird so eine Zeile wie die 6. Zeile in deiner Datei vom Skript auswertet.
Ich gebe dann nur noch an, welche VZ-ID für welche Werte benutzt werden sollen, 
also 
P_AC für 5d485110-9908-11e6-8e35-ade5ad34c96a

Diese Verknüpfung lege ich in Variablen ab:
UUID["P_AC"]="5d485110-9908-11e6-8e35-ade5ad34c96a"

und das Skript findet dann selbständig heraus, an welcher Stelle der 
entsprechende Wert zu suchen ist.


Aber solange sich die Position der Werte in den Dateien nicht ändert, 
funktioniert das obere Skript natürlich schneller und ist auch viel besser 
lesbar.


Viel Erfolg und guten Rutsch.
Lars






Re: [vz-users] Probleme mit Zeilenumbruch in einem Import-Script

2016-12-28 Diskussionsfäden D. Greulich
Hallo Lars,

die Dateien liegen alle unter /home/vz-datenimport/

Eine Datei habe ich angehängt.


Die Code-Zeile die erzeugt werden soll, sollte z.B. so aussehen:

> vzclient -u 681155e0-9906-11e6-b5d9-51edf01eb751 add data value=375
>  ts=136972020


Und so wird es derzeit erzeugt:

> vzclient -u 681155e0-9906-11e6-b5d9-51edf01eb751 add data value=375  ts=
> 136972020



Die 375 und 136972020 (Timestamp, mit den drei Nullen für Volkszähler)
werden durch die RegEx richtig ausgelesen. Lediglich zwischen ts= und ;date
-d "\1" +" %s000"/ep wird ein Zeilenumbruch erzeugt.




Mit freundlichen Grüßen
Dennis Greulich

---

Am 28. Dezember 2016 um 11:52 schrieb Lars Täuber :

> ... und schick doch bitte auch mal eine Ergebniszeile, wie sie entstehen
> soll, mit.
>
> Grüße
> Lars
>
> On Wed, 28 Dec 2016 11:47:54 +0100 Lars Täuber 
> wrote:
> > Hallo Dennis,
> >
> > On Wed, 28 Dec 2016 11:06:00 +0100 "D. Greulich" 
> wrote:
> > > Hallo,
> > >
> > > ich hoffe ihr hattet ein angenehmes Weihnachtsfest.
> > >
> > > Da ich auf meinen BananaPI meine PV-Anlage visualisieren möchte, und
> dazu
> > > die Daten von 4 Jahren nachtragen möchte, bastel ich gerade an einem
> > > Import-Script (siehe Anhang Import.txt)
> > >
> > > Im großen und ganzen läuft es auch schon recht gut, aber leider noch
> nicht
> > > fehlerfrei. Wenn ich es starte, erhalte ich in der CLI folgende
> Meldung:
> > >
> > > {"version":"0.3","exception":{"message":"Invalid time format:
> > > > ''","type":"Exception","code":0}}
> > >
> > >
> > > Die Ursache ist ein Zeilenumbruch, den mein Script beim Timestamp
> erzeugt.
> > > Im Code ist das diese Stelle:
> > >
> > > ...5ad34c96a add data value=\3  ts=;date -d "\1" +" %s000"/ep'
> > >
> > >
> > > Wie kann ich den erzeugten Zeilenumbruch nach ts= verhindern?
> > > Desweiteren beendet sich das Script leider nicht ordnungsgemäß. Ich
> muss es
> > > mit STRG+C beenden. Dazu würde ich auch etwas Hilfe benötigen.
> > >
> >
> > ich bin zwar bald weg, aber schick doch bitte auch mal eine Zeile aus
> den Dateien, die Du das verändern möchtest.
> > Sind die Dateien in verschiedenen Unterverzeichnissen oder liegen alle
> im gleichen Verzeichnis: /home/vz-datenimport/import/ ?
> >
> > vermutlich komme ich erst am Freitag dazu, mich noch mal damit zu
> beschäftigen.
> >
> > Grüße
> > Lars
>
>
> --
> Schöne Grüße
> Lars Täuber
>


id3203-130528092217
Description: Binary data


Re: [vz-users] Probleme mit Zeilenumbruch in einem Import-Script

2016-12-28 Diskussionsfäden Lars Täuber
... und schick doch bitte auch mal eine Ergebniszeile, wie sie entstehen soll, 
mit.

Grüße
Lars

On Wed, 28 Dec 2016 11:47:54 +0100 Lars Täuber  wrote:
> Hallo Dennis,
> 
> On Wed, 28 Dec 2016 11:06:00 +0100 "D. Greulich"  
> wrote:
> > Hallo,
> > 
> > ich hoffe ihr hattet ein angenehmes Weihnachtsfest.
> > 
> > Da ich auf meinen BananaPI meine PV-Anlage visualisieren möchte, und dazu
> > die Daten von 4 Jahren nachtragen möchte, bastel ich gerade an einem
> > Import-Script (siehe Anhang Import.txt)
> > 
> > Im großen und ganzen läuft es auch schon recht gut, aber leider noch nicht
> > fehlerfrei. Wenn ich es starte, erhalte ich in der CLI folgende Meldung:
> > 
> > {"version":"0.3","exception":{"message":"Invalid time format:
> > > ''","type":"Exception","code":0}}
> > 
> > 
> > Die Ursache ist ein Zeilenumbruch, den mein Script beim Timestamp erzeugt.
> > Im Code ist das diese Stelle:
> > 
> > ...5ad34c96a add data value=\3  ts=;date -d "\1" +" %s000"/ep'
> > 
> > 
> > Wie kann ich den erzeugten Zeilenumbruch nach ts= verhindern?
> > Desweiteren beendet sich das Script leider nicht ordnungsgemäß. Ich muss es
> > mit STRG+C beenden. Dazu würde ich auch etwas Hilfe benötigen.
> > 
> 
> ich bin zwar bald weg, aber schick doch bitte auch mal eine Zeile aus den 
> Dateien, die Du das verändern möchtest.
> Sind die Dateien in verschiedenen Unterverzeichnissen oder liegen alle im 
> gleichen Verzeichnis: /home/vz-datenimport/import/ ?
> 
> vermutlich komme ich erst am Freitag dazu, mich noch mal damit zu 
> beschäftigen.
> 
> Grüße
> Lars


-- 
Schöne Grüße
Lars Täuber


Re: [vz-users] Probleme mit Zeilenumbruch in einem Import-Script

2016-12-28 Diskussionsfäden Lars Täuber
Hallo Dennis,

On Wed, 28 Dec 2016 11:06:00 +0100 "D. Greulich"  wrote:
> Hallo,
> 
> ich hoffe ihr hattet ein angenehmes Weihnachtsfest.
> 
> Da ich auf meinen BananaPI meine PV-Anlage visualisieren möchte, und dazu
> die Daten von 4 Jahren nachtragen möchte, bastel ich gerade an einem
> Import-Script (siehe Anhang Import.txt)
> 
> Im großen und ganzen läuft es auch schon recht gut, aber leider noch nicht
> fehlerfrei. Wenn ich es starte, erhalte ich in der CLI folgende Meldung:
> 
> {"version":"0.3","exception":{"message":"Invalid time format:
> > ''","type":"Exception","code":0}}
> 
> 
> Die Ursache ist ein Zeilenumbruch, den mein Script beim Timestamp erzeugt.
> Im Code ist das diese Stelle:
> 
> ...5ad34c96a add data value=\3  ts=;date -d "\1" +" %s000"/ep'
> 
> 
> Wie kann ich den erzeugten Zeilenumbruch nach ts= verhindern?
> Desweiteren beendet sich das Script leider nicht ordnungsgemäß. Ich muss es
> mit STRG+C beenden. Dazu würde ich auch etwas Hilfe benötigen.
> 

ich bin zwar bald weg, aber schick doch bitte auch mal eine Zeile aus den 
Dateien, die Du das verändern möchtest.
Sind die Dateien in verschiedenen Unterverzeichnissen oder liegen alle im 
gleichen Verzeichnis: /home/vz-datenimport/import/ ?

vermutlich komme ich erst am Freitag dazu, mich noch mal damit zu beschäftigen.

Grüße
Lars