wtaler
Goto Top

Abgehackte Datenzeilen

Ich habe einen funktionierenden Batchscript. Jedoch das Problem, dass die Maschinenmeldung abgehackt übertragen werden und dann nicht auswertbar sind. Wer kann mir helfen?

Guten Morgen,

der nachstehende Batchscript funktioniert sehr gut, so lange die Maschinenmeldung über die Funkmodule komplett übertragen werden. In der letzten Zeit habe ich aber häufig das Problem, dass die Meldungen
durch Übertragungsstörungen nur unvollständig übertragen werden. Wenn die Übertragung unvollständig ist, dann wird die Meldung maximal zweimal - innerhalb 20 Sekunden - wiederholt und es kommt vor, das erst die
dritte Meldung komplett auswertbar ist. Daher nun meine Frage, was kann ich tun, das %~3 im Filter ausgewertet und %3 in die Datei "mailinhalt" mit dem vollständigem Text eingetragen wird? Die Datei a*.txt ist ein Hinweis
zum Fehlertext und beinhaltet nur eine Ziffer. Diese Übertragung ist passend und eindeutig. %4 ist ein feststehender Text und funktioniert auch.

@echo off &setlocal
chcp 1252
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
del c:\a*.txt
ping -n 8 localhost>nul
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt
goto :eof
:weiter
del c:\a*.txt

Gruß

Christoph

Content-Key: 144698

Url: https://administrator.de/contentid/144698

Printed on: April 16, 2024 at 15:04 o'clock

Mitglied: 77559
77559 Jun 12, 2010 at 09:49:41 (UTC)
Goto Top
Hallo Christoph,

ich habe deinen Text jetzt 3 aml durchgelesen und weiß immer noch nicht was dein Problem und was du jetzt erwartest?

Entweder liegt es an mir oder du hast das Problem nicht ausreichend beschrieben
  • was steht in filter.txt ?
  • wellche exemplarischen %3 bekommst du ?

Gruß
LotPings
Member: wtaler
wtaler Jun 12, 2010 at 10:19:27 (UTC)
Goto Top
Ergänzung:

In der Datei filter.txt stehen die Worte:

Blech
Stanze1
Stanze 2
Programm968
Programm1268
und noch 20 weitere


Die Meldung aus %3 ist bei korrekter Übertragung

20100612030601 Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg

aber es kommt in den letzten Wochen folgende Übertragung für das Funknetzwerk an:

20100612030601Blech - Stokzwl
20100612030607Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg

oder

20100612030601Bl[ef)e
20100612030607B
20100612030616Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg

Mitglied: 77559
77559 Jun 12, 2010 at 11:29:37 (UTC)
Goto Top
Zitat von @wtaler:
aber es kommt in den letzten Wochen folgende Übertragung für das Funknetzwerk an:

20100612030601Blech - Stokzwl
Aber deser unvollständige Eintrag würde deiner Prüfung doch standhalten?

Wäre es nicht sinnvoller die Striktur nach Länge Anzahl Elementen auf vollständigkeit zu testen?
20100612030607Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg
Am Anfang ein DatumUhrzeit String und
trennen an den " - " und prüfen ob in den Teilen jeweils Lager/Platz/Soll/Ist/kg vorkommt?

Gruß
LotPings
Member: wtaler
wtaler Jun 12, 2010 at 11:35:47 (UTC)
Goto Top
Hallo LotPings,

das wäre ein Vorschlag, aber es sind bis zu 500 unterschiedliche Medlungen und die Länge ist nicht immer gleich. Auch ist nicht in jeder Maschinenmeldung der Zeitstempel enthalten.

Gruß

Christoph
Member: rubberman
rubberman Jun 12, 2010 at 11:56:41 (UTC)
Goto Top
Hallo Christoph,
dass man aus Daten, wie

20100612030601Bl[ef)e
20100612030607B

das Wort Blech ganz sicher nicht wiedererkennen kann ist doch klar. Die Frage ist doch erst einmal
-Was soll mit solchen Daten überhaupt passieren?
-Gibt es andere Kriterien (zb Zeitstempel oder Mindestlänge des Datensatzes) nach denen eine (Vor-)Auswahl getroffen werden könnte?

Grüße
rubberman

PS: Eigentlich noch wichtiger ist die Frage: Was kannst du technisch tun, um das Verstümmeln der Datensätze in Zukunft zu vermeiden.
Member: wtaler
wtaler Jun 12, 2010 at 12:51:26 (UTC)
Goto Top
Hallo rubberman,

technisch kann ich nichts mehr tun, weil der zweite oder dritte Satz ja richtig kommt. Eigentlich würde ich gerne den verstümmelten Datensatz bei der Auswertung und bei der Füllung auslassen. Bei der Ausgabe der Maschinenmeldung kann ich noch ein Satzendezeichen mit [NULL] - also wirklich [NULL] geschrieben - mitgeben und das kommt dann bei abgehackten Meldungen nicht mit.

Gruß

Christoph
Member: pieh-ejdsch
pieh-ejdsch Jun 12, 2010 at 13:36:15 (UTC)
Goto Top
Hi wtaler,

wenn Du die Zeile 2
echo %~3|findstr /g:c:\filter.txt>null || goto weiter

folgendermaßen schreibst (ein Zusätzliches Leerzeichen nach dem ECHO):
echo  %~3|findstr /g:c:\filter.txt>null || goto weiter

Und in Deine Filter.TXT an jedem Zeilenanfang ein Leerzeichen setzt (zB. mit dieser KommandoZeile)
(for /f "tokens=*" %i in (c:\filter.txt) do echo  %i>>"%temp%\filter) &move /y "temp%\filter" c:\filter.txt  

dann werden zumindest solche Zeilen:
20100612030607Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg
NICHT mitaufgenommen!

es kann natürlich sein, dass Du nach Zahlen in der "filter.txt" suchst. vllt sind diese der Übeltäter zB.:
006
diese gibt Dir auch eine Erfolgsmeldung vom FindStr aus
20100612030607

Gruß Phil
Member: wtaler
wtaler Jun 12, 2010 at 14:22:59 (UTC)
Goto Top
Hallo Phil,

danke für Deinen Ansatz. In der filter.txt sind keine Zahlen drin.

Das Stopalager gibt mir

20100612030601Bl[ef)e
20100612030607B
20100612030616Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg[NULL]

als Datensätze und die Stanzen produzieren folgende Daten:

Sta[17HG][FF][DC]
Stanze1 - Störung in Programm19654[NULL]

Ansonsten geht es mir eher um die Lösung, wie ich

20100612030601Bl[ef)e
20100612030607B

bei der Auswertung ingorieren und nicht in die Datei mailinhalt.txt bringen kann, so dass nur der Datensatz

20100612030616Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg[NULL]

oder

Stanze1 - Störung in Programm19654[NULL]

ausfiltern und in die mailinhalt.txt schreiben kann. Wichtig ist aber auch, dass die Inhalte von a*.txt in den Mailinhalt laufen und nicht verloren gehen.

Gruß

Christoph
Member: pieh-ejdsch
pieh-ejdsch Jun 12, 2010 at 16:02:20 (UTC)
Goto Top
Hallo Christoph,

Dann mach doch wenn Du bei jeden GUTEN Datensatz am Zeilenende [NULL] stehen hast anstatt nach Blech laut der filter.txt zu suchen

set "Zeile=%~3"  
if not "%Zeile:~-6%" == "[NULL]" goto :weiter  

oder sonst machst Du
(echo %~3|findstr /g:c:\filter.txt>nul || echo %~3|findstr /e "NULL] DC]">nul)||goto :weiter  

vllt ist Die Umleitung ins Bodenlose (>nul) schuld obwohl ja keine Befehlsverkettungszeichen in "3~%" stehen???
aber eine 2 am ende von echo "3~%" geht schonmal schief.....

was passiert denn mit
Sta[17HG][FF][DC]
kommt das auch in die Mail?

bei Zeile 3,4 und 5 kannst Du andersherum schreiben.
>>c:\subject.txt echo %4
>>c:\mailinhalt.txt echo %3
>>c:\mailinhalt.txt type c:\a*.txt

Gruß Phil
Member: wtaler
wtaler Jun 12, 2010 at 16:16:46 (UTC)
Goto Top
Hallo Phil,

danke für die Antwort.

Sta[17HG][FF][DC] soll ignoriert werden. Deinen Vorschlag werde ich morgen ausprobieren und mich dazu melden. Aber bei der Funktion :weiter werden die Zusatzinfoaus a*.txt auch gelöscht. Hast Du dafür noch einen Vorschlag?

Gruß

Christoph
Member: pieh-ejdsch
pieh-ejdsch Jun 12, 2010 at 21:25:19 (UTC)
Goto Top
Hallo Christoph,

ich fasse es nochmal zusammen, so wie ich es Verstanden habe

  • Die Maschinen geben Meldungen aus, welche verwertbar sind oder Nicht verwertbar sind.
  • Ob eine Meldung verwertbar ist wird über den dritten Parameter der BatchDatei Abgefragt/Überprüft.
    • Eine Verwertbare MaschinenMeldung beinhaltet am Ende vom dritten Parameter ein [NULL]
    • Eine nicht verwertbare MaschinenMeldung wird nicht verabeitet/ge-mailt und die Batch wird beendet.
  • Wenn die MaschinenMeldung verwertbar ist.
    • Wird ein vierter Parameter in eine TextDatei subject.txt auf Laufwerk C:\ eingetragen,
    • Der dritte Parameter der MaschinenMeldung wird in eine mailinhalt.txt auf dem Laufwerk C:\ eingetragen,
    • Der Inhalt der/aller TextDatei(en) welche mit a beginnen und auf Laufwerk C:\ liegen werden in die mailinhalt.txt auf Laufwerk C:\ eingetragen.
    • Alle TextDatei(en) welche mit a beginnen und auf Laufwerk C:\ liegen werden gelöscht.
    • Die Mail wird versendet und subject.txt sowie mailinhalt.txt auf Laufwerk C:\ werden gelöscht.
  • Wenn die MaschinenMeldung Nicht verwertbar ist.
    • Alle TextDatei(en) welche mit a beginnen und auf Laufwerk C:\ liegen werden gelöscht.

wenn dem so ist würde die Batch so funktionieren:
@echo off &setlocal
set "Zeile=%~3"  
if not "%Zeile:~-6%" == "[NULL]" goto :weiter  
chcp 1252
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
ping -n 8 localhost>nul 
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt 
:weiter
del c:\a*.txt

da ja die Textdatei(en) beginnend mit a auf Laufwerk C:\ in beiden Szenarien gelöscht werden, kann dies auch zum Ende der Batch erfolgen.

Bitte fasse Deinen Code aus dem FrageBeitrag in Formatting instructions in the posts.
(davor ein <code> und dahinter ein </code> setzen)

Gruß Phil
Member: wtaler
wtaler Jun 13, 2010 at 10:59:42 (UTC)
Goto Top
Hallo Phil,

ich habe die Programmierung ausgetestet und es kommt die Fehlermeldung

not Befehl fehlerhaft

und dann verschwindet die Batchbox.

Gruß

Christoph
Member: pieh-ejdsch
pieh-ejdsch Jun 13, 2010 at 12:41:07 (UTC)
Goto Top
ups .....
da hat die Internet-Druckmaschine nicht richtig funktioniert!

ich hab den Fehler berichtigt in Zeile 03

irgendwie ist mir da if durch die Lappen gegangen.

Gruß Phil
Member: wtaler
wtaler Jun 13, 2010 at 21:32:55 (UTC)
Goto Top
Hallo Phill,

herzichen Dank für Deine Unterstützung, denn die Ausfilterung der abgehackten Datensätze funktioniert. Aber wie kann ich den Befehl


in die IF-Abfrage einbauen, damit danach nur die gewünschten Datensätze aus der Filterdatei übertragen werden. Im Moment wird auch jeder Datensatz
aus den Maschinen und Lager übertragen, auch wenn unwichtige Informationen sind.

Weiterhin habe ich noch die Frage wie der Code lauten muss, dass die Dateien a*.txt nicht gelöscht werden, wenn der Befehl

if not "%Zeile:~-6%" == "[NULL]" goto :weiter

angesprochen wird, da ich die a*.txt noch für die Befehlszeile

type c:\a*.txt>>c:\mailinhalt.txt

benötige.

Viele Grüße

Christoph
Member: pieh-ejdsch
pieh-ejdsch Jun 13, 2010 at 22:51:38 (UTC)
Goto Top
... Aber wie kann ich den Befehl

in die IF-Abfrage einbauen ...
einfach nach der dritten Zeile Einfügen
achso: nul mit nur einem L

@echo off &setlocal
set "Zeile=%~3"  
if not "%Zeile:~-6%" == "[NULL]" goto :weiter  
echo %~3|findstr /g:c:\filter.txt>nul || goto :weiter
chcp 1252
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
ping -n 8 localhost>nul 
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt 
del c:\a*.txt
:weiter

... dass die Dateien a*.txt nicht gelöscht werden, wenn der Befehl
if not "%Zeile:~-6%" == "[NULL]" goto :weiter ...
Es wird doch erst a*.txt in mailinhalt.txt geschrieben und danach erst gelöscht!

ich dachte die a*.txt würden nur in die Mail geschrieben werden, wenn das ganze gedöns Brauchbar ist.
laut Deiner 1. Batch wird das doch auch gelöscht: einmal nach eintrag in mailinhalt.txt und als Alternative wenn die Meldungen aus %~3 Abfall ist (nach :weiter)

Verwirrt mich jetzt doch ein bisschen wann soll denn nun die a*.txt gelöscht werden
Vllt erklärst Du nochmal genau was die Batch wann machen soll Klammer-auf so wie ich Hier mit Stichpunkten Klammer-zu

Gruß Phil
Member: wtaler
wtaler Jun 14, 2010 at 06:22:26 (UTC)
Goto Top
Giuten Morgen Phil,

bei der Batch soll folgendes passieren:

01.@echo off &setlocal
02.set "Zeile=%~3"
03.if not "%Zeile:~-6%" == "[NULL]" goto :weiter (Hier soll der abgehackte Text nicht in die Datei Mailinhalt.txt geschrieben werden, weil der abgehackte Datensatz nach wenigen Sekunden noch mal von der Maschine übertragen wird. Zusätzlich zu den Maschinenmeldungen werden noch Statusmeldungen, wei F2 oder Z4 oder AB1 in separaten Dateien übertragen, die a1.txt, a2.txt usw. lauten und bei der abgehacktenMaschinenmeldung natürlich nicht gelöscht werden dürfen.)

Nun noch eine Frage - in 03 steht if not "%Zeile:~-6%" == "[NULL]" goto :weiter und prüft die letzten sechs Zeichen ab. Wenn ich :~-6 heraus lösche, dann sollte die ganze Zeile nach [NULL] geprüft werden oder?:

Herzlichen Dank für Deine Hilfestellungen.

Viele Grüße

Christoph
Member: pieh-ejdsch
pieh-ejdsch Jun 14, 2010 at 09:44:57 (UTC)
Goto Top
Moin Christoph,

"%Zeile:~-6%"
~= Zeige mir nur die Anzahl Zeichen der Variable Zeile
- = zähle von hinten nach vorn
6= zähle sechs Zeichen ab

steht also für: zeige die letzten sechs Zeichen der Variable Zeile

hier ist nochmal Dein geänderter Batch
@echo off &setlocal
set "Zeile=%~3"  
::in der naechsten Zeile wird auf eine Vollstaendige MaschinenMeldung geprueft
::wenn die letzten 6 Zeichen der Meldung nicht [NULL] sind, wird nur die Batch beendet (a*.txt bleiben erhalten).
if not "%Zeile:~-6%" == "[NULL]" goto :eof  
::in der naechsten Zeile wird die Vollstaendige MaschinenMeldung auf Uebereinstimmung von Zeichenfolgen aus der filter.txt geprueft
::wenn keine Zeichenfolge der filter.txt in der Meldung vorkommt, wird zur Sprungmarke :Weiter gegangen.
echo %~3|findstr /g:c:\filter.txt>nul || goto :weiter
chcp 1252
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
ping -n 8 localhost>nul 
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt 
:weiter
::Nur wenn -
::A: die Meldung keine Zeichenfolge aus der filter.txt beinhaltet hat, wird a*.txt geloescht!
::B: es zum Versandt der Mail kam, wird a*.txt geloescht!
del c:\a*.txt

Gruß Phil
Member: wtaler
wtaler Jun 14, 2010 at 11:03:20 (UTC)
Goto Top
Herzlichen Dank, das Problem ist gelöst. Gruß Christoph