[Bash-Script] Fehlerhaften Wert ausmerzen

brenner

Commander
Registriert
Apr. 2002
Beiträge
3.037
Moin moin,


ich habe hier ein Script welches mir an einer Stelle Sorgen macht.

Aus einer Textdatei (/scripts/sdm630m_to_cacti-pv01.txt) werden Werte ausgelesen und im weiteren Velauf verarbeitet.


Code:
###
# Werte der PV01 Anlage einlesen
###
#
for line in file('/scripts/sdm630m_to_cacti-pv01.txt'):
    pv01array = line.split(':')
#
DAILYPROD = float(pv01array[0])
#AC-seitig erzeugte Leistung
PAC1 = float(pv01array[1])
PAC1 = "%.0f" % PAC1


Normalerweise sieht der Inhalt der Textdatei so aus und alles funktioniert:
Code:
123:1234


Leider kommt es ab und zu vor das der Inhalt so aussieht:
Code:
35695950:3569595041 4294901760 352387072 3949600463 2424422568 3996903512 131289 1112879921 33554432 0 2265511936 0 469910768 0 754997582 3221225472 0 0 1436608519 1788010680 3808428095 2115280881 301989888 875835702 0 206503936 0 0 5373952 0 0 5636096 1505755136 0:
Das ist durch diverse Umstände bedingt und kann derzeit nicht verhindert werden.


Wenn in der Textdatei dieser Müll steht, schlägt das Script fehl und die Ausgabe sieht so aus:
Code:
root@cacti04:/scripts# ./sdm630m_to_db.py
Traceback (most recent call last):
  File "./sdm630m_to_db.py", line 280, in <module>
    PAC1 = float(pv01array[1])
ValueError: invalid literal for float(): 3569595041 4294901760 352387072 3949600463 2424422568 3996903512 131289 1112879921 33554432 0 2265511936 0 469910768 0 754997582 3221225472 0 0 1436608519 1788010680 3808428095 2115280881 301989888 87
root@cacti04:/scripts#



Wie kann ich verhindern das das Script aufgrund diesen Fehlers seine Funktion nicht weiter ausführen kann?
Wenn Müll in der Textdatei erkannt wird würde ich den beiden Variablen (DAILYPROD und PAC1) gerne den Wert 1 fest zuweisen damit das Script weiter abgearbeitet wird.
 
Zuletzt bearbeitet:
Naja ich würde dann eben auf die Länge des Arrays testen, ob mehr als 2 Elemente vorhanden sind (da kommt ja noch einmal ein Doppelpunkt am Schluss). Oder das zweite Element ([1]) nochmals mit Leerzeichen splitten und testen ob es sich in mehrere Elemente zerlegen lässt. Dazu dann einfach eine if Abfrage und hard codierte Werte deinen Variablen zuweisen.
 
brenner schrieb:
Moin moin,


ich habe hier ein Script welches mir an einer Stelle Sorgen macht.

Aus einer Textdatei (/scripts/sdm630m_to_cacti-pv01.txt) werden Werte ausgelesen und im weiteren Velauf verarbeitet.


Code:
###
# Werte der PV01 Anlage einlesen
###
#
for line in file('/scripts/sdm630m_to_cacti-pv01.txt'):
    pv01array = line.split(':')
#
DAILYPROD = float(pv01array[0])
#AC-seitig erzeugte Leistung
PAC1 = float(pv01array[1])
PAC1 = "%.0f" % PAC1


Normalerweise sieht der Inhalt der Textdatei so aus und alles funktioniert:
Code:
123:1234


Leider kommt es ab und zu vor das der Inhalt so aussieht:
Code:
35695950:3569595041 4294901760 352387072 3949600463 2424422568 3996903512 131289 1112879921 33554432 0 2265511936 0 469910768 0 754997582 3221225472 0 0 1436608519 1788010680 3808428095 2115280881 301989888 875835702 0 206503936 0 0 5373952 0 0 5636096 1505755136 0:
Das ist durch diverse Umstände bedingt und kann derzeit nicht verhindert werden.


Wenn in der Textdatei dieser Müll steht, schlägt das Script fehl und die Ausgabe sieht so aus:
Code:
root@cacti04:/scripts# ./sdm630m_to_db.py
Traceback (most recent call last):
  File "./sdm630m_to_db.py", line 280, in <module>
    PAC1 = float(pv01array[1])
ValueError: invalid literal for float(): 3569595041 4294901760 352387072 3949600463 2424422568 3996903512 131289 1112879921 33554432 0 2265511936 0 469910768 0 754997582 3221225472 0 0 1436608519 1788010680 3808428095 2115280881 301989888 87
root@cacti04:/scripts#



Wie kann ich verhindern das das Script aufgrund diesen Fehlers seine Funktion nicht weiter ausführen kann?
Wenn Müll in der Textdatei erkannt wird würde ich den beiden Variablen (DAILYPROD und PAC1) gerne den Wert 1 fest zuweisen damit das Script weiter abgearbeitet wird.

Weg #1: Den Fehler abfangen und wenn der Fehler auftritt die beiden Variablen DAILYPROD und PAC1 den Wert 1 zuweisen.

Weg #2: Da es scheint, dass nur der Wert mit 35695950:3569595041 interessant für dich scheint, würde ich sagen, du liest die Werte bis zum ersten Leerzeichen ein. Dann kannst weiterarbeiten.
 
Weg2 würde nicht "funktionieren" da die Werte falsch sind. Die echten Werte sind höchstens 4stellig. Würde ich die falschen Werte übernehmen hätte ich extreme Peaks in meinen Grafiken.


Bei Weg1 weiß ich eben nicht wie ich den Fehler abfangen kannn :-(
 
Zurück
Oben