mit.ohne.ahnung
Goto Top

Ausgelesene Daten automatisch aufbereiten um in anderer DB (Programm) einzulesen.

Ein freundliches Hallo erstmal,

mein Name ist Frank und ich stehe vor einem (für mich face-smile ) unlösbaren Problem.

Die Aufgabenstellung ist aus Programm A ausgelesene Daten (vorgegebene Exportfunktion des Programms) in ein anderes Programm B einlesen.
Dazu müssen die Daten für Programm B aufbereitet werden (leider auch vorgegeben).
So weit so gut.... ich bekomme das auch hin mit viel gefummel. Das Problem ist das dies unsere Vertriebler machen sollen. Da dies ganze so komplex ist, denke ich das trotz Anleitung zu Fehlern führen wird.
Daher suche ich eine Möglichkeit das ganze zum teil zu Automatisieren. Zumindest die Aufbereitung der Daten, alles andere ist ohne Probleme mit Anleitung erklärt.
Die Aufbereitung der Daten ist aber so Komplex das ich nicht mal weiß wo ich ansatzweise anfangen soll.... auch weil scripten nicht unbedingt mein Ding ist.
Hier mal die dat Datei wie ich Sie aus Programm A erhalte:
PraxMini-Absender^PraxFensterzeile1^PraxFensterzeile2^PraxStrasse^PraxPlz^PraxOrt^PatNr^Anrede^Titel^Vorname^Namenszusatz^Nachname^Strasse^Plz^Ort^LBehandlung^LRecall^Telefon^EMail
Z1 - Maria Trost 25 - 56070 Koblenz^^Z1^Maria Trost 25^56070^Koblenz^         1^Herrn^^Hans^^Glückskind^Maria Trost 25^56070^Koblenz^^^0261-80700-0^
Z1 - Maria Trost 25 - 56070 Koblenz^^Z1^Maria Trost 25^56070^Koblenz^         2^Kind^^Felix^^Musterkind^Münsterlandstr. 4^99999^Musterstadt^31.08.2006^^0261/80700-0^compudent@compugroup.com
Z1 - Maria Trost 25 - 56070 Koblenz^^Z1^Maria Trost 25^56070^Koblenz^         3^Frau^^Frieda^^Blox^Markus-Schleicher-Str. 12^07552^Gera^16.12.2004^^^
Z1 - Maria Trost 25 - 56070 Koblenz^^Z1^Maria Trost 25^56070^Koblenz^         4^Herrn^Prof.^Kurt^^Tannert^Dahlienweg 12^08527^Plauen^01.10.2004^^0261/80^
Z1 - Maria Trost 25 - 56070 Koblenz^^Z1^Maria Trost 25^56070^Koblenz^         5^Kind^^Hänschen^^Planung^Maria Trost 25^56070^Koblenz^23.03.1999^^0261/80^
und so bräuchte ich Sie als txt:
1;x	;Hans	;	Glückskind	;Maria Trost 25		;56070	;Koblenz	;0261-80700-0	#
2;x	;Felix	;	Musterkind	;Münsterlandstr. 4	;99999	;Musterstadt	;0261/80700-0	#
3;x	;Frieda	;	Blox		;Schleicher-Str. 12	;7552	;Gera		;x		#
4;Prof.	;Kurt	;	Tannert		;Dahlienweg 12		;8527	;Plauen		;0261/80	#
5;x	;Hänschen;	Planung		;Maria Trost 25		;56070	;Koblenz	;0261/80	#
Semikolon als Trennzeichen und Raute als Datensatzende... die X stehen als Platzhalter da keine Leeren Felder sein dürfen!
Hoffe ich konnte mich deutlich ausdrücken face-smile ... ist das ganze so möglich das die Vertriebler nur in Ordner IN auf Desktop schieben und dann ausgabe in Ordner OUT und das ganze per batch oder script gewandelt wird?

Danke schon mal im voraus für eure Gedankengänge

Grüße Frank

[Edit Biber] Codeformatierung nachgezogen.
P.S. Sollten wir es nich in Richtung "Bätchkrams" schieben? [/Edit]

Content-Key: 206528

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

Printed on: April 25, 2024 at 04:04 o'clock

Member: bastla
bastla May 15, 2013 at 16:25:34 (UTC)
Goto Top
Hallo Mit.ohne.Ahnung und willkommen im Forum!

Bitte ergänze die Darstellung der Datensätze (insbes der Ausgangsdaten) durch "Code"-Formatierung (mit <code> und </code>) ...

Grüße
bastla
Member: Mit.ohne.Ahnung
Mit.ohne.Ahnung May 15, 2013 at 18:44:52 (UTC)
Goto Top
Hallo bastla,

wow, danke für die schnelle Antwort. Versteh leider nicht wie du das meinst?
Ich habe das genau so aus der dat Datei herauskopiert. Die Trennzeichen von Software A sind wohl "^"

Gruß Frank
Member: bastla
bastla May 15, 2013 updated at 18:54:52 (UTC)
Goto Top
Hallo Mit.ohne.Ahnung!
Versteh leider nicht wie du das meinst?
Biber hat die Formatierung nachgeholt (wenn Du den Beitrag editierst, kannst Du Dir auch ansehen, wie) - jetzt lässt sich auch erkennen, dass zB nach dem ersten "Koblenz" 2 Trennzeichen folgen ...

Brauchst Du tatsächlich im Ergebnis nicht nur das Semikolon als Trennzeichen, sondern davor auch noch TAB?

Grüße
bastla
Member: Mit.ohne.Ahnung
Mit.ohne.Ahnung May 15, 2013 at 19:05:59 (UTC)
Goto Top
Hallo Bastla,

nur das Semikolon als Trennzeichen und Raute als Datensatzende. Leere Felder habe ich einfach mit x belegt da ich keine leeren Felder haben darf.

In der Ausgangsdatei stellen sich leere Felder so dar ^text^^text

Grüße Frank
Member: bastla
bastla May 15, 2013 at 19:40:07 (UTC)
Goto Top
Hallo Mit.ohne.Ahnung!

Als VBScript zum Testen für eine Datei:
Ein = "D:\Ein.txt"  
Aus = "D:\Aus.txt"  
DelimAlt = "^"  
DelimNeu = ";"  
Zeilenende = "#"  
FeldNummern = Array(6,8,9,11,12,13,14,17) 'benötigte Felder, Zählung beginnt bei 0  

Set fso = CreateObject("Scripting.FileSystemObject")  
'gesamten Dateiinhalt einlesen, leere Felder durch "x" ersetzen und in Zeilen aufteilen  
Zeilen = Split(Replace(fso.OpenTextFile(Ein).ReadAll, DelimAlt & DelimAlt, DelimAlt & "x" & DelimAlt), vbNewLine)  

For i = 1 To UBound(Zeilen) 'Kopfzeile überspringen  
    If Trim(Zeilen(i)) <> "" Then 'Leerzeilen nicht verarbeiten  
        Felder = Split(Zeilen(i), DelimAlt) 'Zeile in Felder aufspalten  
        A = A & vbNewLine & Trim(Felder(FeldNummern(0))) 'Zeilenschaltung und erstes Feld ohne Delimiter eintragen  
        For j = 1 To UBound(FeldNummern) 'übrige Feldnummern durchgehen  
            A = A & DelimNeu & Felder(FeldNummern(j)) 'weitere Felder mit vorangestelltem Delimiter hinzufügen  
        Next
        A = A & Zeilenende 'Zeilenendekennung anfügen  
    End If
Next
fso.CreateTextFile(Aus).Write Mid(A, 3)'Inhalt schreiben, führende Zeilenschaltung in Zeile 1 überspringen  
Grüße
bastla
Member: Mit.ohne.Ahnung
Mit.ohne.Ahnung May 15, 2013 at 20:13:10 (UTC)
Goto Top
Hallo bastla,

RESPEKT !!!!

verfolge ja öfters deine post´s ..... und war schon öfters überrascht !

Hut ab ! ! !

vielen dank !

werde jetzt noch paar Testdaten anlegen und noch mal testen, dann schließe ich als gelöst. Denke aber das ist die Lösung

herzlichen Dank und dir noch einen schönen Abend.

Liebe grüße

Frank
Member: Mit.ohne.Ahnung
Mit.ohne.Ahnung May 15, 2013 at 20:19:58 (UTC)
Goto Top
hallo bastla,

eine kleinigkeit noch.

wie kann ich in dem script die datei vorher noch umbenennen..... so heist die datei "z1_patsel.dat"
das sie in z1_patsel.txt umbenannt wird ... also nur .txt ... oder läuft das script auch wenn die endung dat heist?

gruß Frank
Member: bastla
bastla May 15, 2013 at 20:30:02 (UTC)
Goto Top
Hallo Mit.ohne.Ahnung!

Sinnvoll wäre es vermutlich, die ".dat"-Datei als Parameter zu übergeben (auch per Drag & Drop auf die Scriptdatei) und die neue Datei als ".txt" zu speichern - etwa so:
DelimAlt = "^"  
DelimNeu = ";"  
Zeilenende = "#"  
FeldNummern = Array(6,8,9,11,12,13,14,17) 'benötigte Felder, Zählung beginnt bei 0  

If WScript.Arguments.Count < 1 Then 'kein Parameter übergeben  
    WScript.Echo "DAT-Datei als Parameter übergeben!"  
    WScript.Quit 1
End If

Set fso = CreateObject("Scripting.FileSystemObject")  
Ein = WScript.Arguments(0)

If LCase(Right(Ein, 4) <> ".dat" Then 'Eingabedatei nicht vom Typ ".dat"  
    WScript.Echo "DAT-Datei als Parameter übergeben!"  
    WScript.Quit 2
End If

Aus = Left(Ein, Len(Ein) - 3) & "txt" 'Ausgabedatei auf ".txt" umbenennen  

'gesamten Dateiinhalt einlesen, leere Felder durch "x" ersetzen und in Zeilen aufteilen  
Zeilen = Split(Replace(fso.OpenTextFile(Ein).ReadAll, DelimAlt & DelimAlt, DelimAlt & "x" & DelimAlt), vbNewLine)  

For i = 1 To UBound(Zeilen) 'Kopfzeile überspringen  
    If Trim(Zeilen(i)) <> "" Then 'Leerzeilen nicht verarbeiten  
        Felder = Split(Zeilen(i), DelimAlt) 'Zeile in Felder aufspalten  
        A = A & vbNewLine & Trim(Felder(FeldNummern(0))) 'Zeilenschaltung und erstes Feld ohne Delimiter eintragen  
        For j = 1 To UBound(FeldNummern) 'übrige Feldnummern durchgehen  
            A = A & DelimNeu & Felder(FeldNummern(j)) 'weitere Felder mit vorangestelltem Delimiter hinzufügen  
        Next
        A = A & Zeilenende 'Zeilenendekennung anfügen  
    End If
Next
fso.CreateTextFile(Aus).Write Mid(A, 3)'Inhalt schreiben, führende Zeilenschaltung in Zeile 1 überspringen  
Grüße
bastla
Member: Mit.ohne.Ahnung
Mit.ohne.Ahnung May 15, 2013 at 21:21:28 (UTC)
Goto Top
Hallo bastla,

nochmals vielen Dank für deine Bemühungen !!!

Konnte das Problem ganz einfach lösen face-smile (kleine Erfolge tun mir auch gut face-smile

Da die datei das Programm A ausgibt immer gleich heist habe ich dein script einfach so angepasst face-smile

Ein = "C:\input\z1_patsel.dat"
Aus = "C:\output\Charly_Import.txt"

funktioniert Prima face-smile

Danke

Gruß Frank
Member: Mit.ohne.Ahnung
Mit.ohne.Ahnung May 17, 2013 at 10:32:50 (UTC)
Goto Top
Hallo bastla,

einen kleinen bug habe ich jetzt doch noch entdeckt, wo ich nicht weiter komme. Wie ich dein script verstehe liest du ja die Felder aus, die bearbeitet werden müssen, und wo nichts steht wird ein x eingesetzt. In der Ausgabe Datei ist mir aufgefallen, das bei "Straße" kein x gesetzt wird.

Eingabedatei Beispiel: (Namen und Tel. geändert wegen Datenschutz)
7569^FrauAngelikaHeblabla^
Dr. F. Name & Dr. K. Name - Geeeestr. 3 - 60313 Frankfurt/M.^Zahnarztpraxis G3^Dr. F. Name & Dr. K. Name^Geeeestr. 3^60313^Frankfurt/M.^
7590^Frau
Sigridblablabla0101-62222226^
Dr. F. Name & Dr. K. Name - Geeeestr. 3 - 60313 Frankfurt/M.^Zahnarztpraxis G3^Dr. F. Name & Dr. K. Name^Geeeestr. 3^60313^Frankfurt/M.^

Ausgabedatei Beispiel:
7569;x;Angelika;Heblabla;x;;x;#
7590;x;Sigrid;blablabla;x;;x;0111-66666666#

Es wird also in Feld Straße kein X gesetzt ?

So dachte ich(wenn ich dein script richtig verstanden habe, das in Zeile 6 (Feldnummern=Array das Feld nicht angegeben wäre und ich nur noch das Feld angeben muss?? Geh ich richtig in der Annahme, da Zählung bei 0 anfängt ich nur bei Array die 7 hinzufügen muss?

Script von dir:
Ein = "C:\Dokumente und Einstellungen\All Users\Desktop\Input\z1_patsel.dat"
Aus = "C:\Dokumente und Einstellungen\All Users\Desktop\output\Charly_Import.txt"
DelimAlt = "^"
DelimNeu = ";"
Zeilenende = "#"
FeldNummern = Array(6,8,9,11,12,13,14,17) 'benötigte Felder, Zählung beginnt bei 0

Set fso = CreateObject("Scripting.FileSystemObject")
'gesamten Dateiinhalt einlesen, leere Felder durch "x" ersetzen und in Zeilen aufteilen
Zeilen = Split(Replace(fso.OpenTextFile(Ein).ReadAll, DelimAlt & DelimAlt, DelimAlt & "x" & DelimAlt), vbNewLine)

For i = 1 To UBound(Zeilen) 'Kopfzeile überspringen
If Trim(Zeilen(i)) <> "" Then 'Leerzeilen nicht verarbeiten
Felder = Split(Zeilen(i), DelimAlt) 'Zeile in Felder aufspalten
A = A & vbNewLine & Trim(Felder(FeldNummern(0))) 'Zeilenschaltung und erstes Feld ohne Delimiter eintragen
For j = 1 To UBound(FeldNummern) 'übrige Feldnummern durchgehen
A = A & DelimNeu & Felder(FeldNummern(j)) 'weitere Felder mit vorangestelltem Delimiter hinzufügen
Next
A = A & Zeilenende 'Zeilenendekennung anfügen
End If
Next
fso.CreateTextFile(Aus).Write Mid(A, 3)'Inhalt schreiben, führende Zeilenschaltung in Zeile 1 überspringen

Würde mich freuen wenn ich Recht hätte, dann hätte ich ja dein script verstanden face-smile

Danke schonmal für deine Bemühungen

LG Frank
Member: Mit.ohne.Ahnung
Mit.ohne.Ahnung May 17, 2013 updated at 11:59:07 (UTC)
Goto Top
Hallo bastla,

nachtrag....

habe das ganze nochmals geprüft

da ist mir aufgefallen das zwischendurch willkürlich kein x gesetzt wurde ??? Also nicht nur bei Straße

Hier scheint wohl doch ein tab oder leerzeichen in der spalte zu sein

in:
1495^Frau^^Ursula^^Name^ ^ ^ ^21.12.2010^^635518^
out:
1495;x;Ursula;Name; ; ; ;635518#
gruß Frank

[Edit Biber] Nochmal Codeformatierung nachgezogen. [/Edit]
Member: bastla
bastla May 17, 2013 at 13:22:54 (UTC)
Goto Top
Hallo Mit.ohne.Ahnung!

Versuch es mit folgendem Ersatz der Zeilen ab 21:
'gesamten Dateiinhalt einlesen, leere Felder durch "x" ersetzen und in Zeilen aufteilen  
Zeilen = Split(fso.OpenTextFile(Ein).ReadAll, vbNewLine)

For i = 1 To UBound(Zeilen) 'Kopfzeile überspringen  
    If Trim(Zeilen(i)) <> "" Then 'Leerzeilen nicht verarbeiten  
        Felder = Split(Zeilen(i), DelimAlt) 'Zeile in Felder aufspalten  
        A = A & vbNewLine & Trim(Felder(FeldNummern(0))) 'Zeilenschaltung und erstes Feld ohne Delimiter eintragen  
        For j = 1 To UBound(FeldNummern) 'übrige Feldnummern durchgehen  
            W = Felder(FeldNummern(j))' Feldinhalt auslesen  
            'Feldinhalte, die nur aus Leerzeichen und/oder einem TAB bestehen durch "x" ersetzen  
            If Trim(W) = "" Or Trim(W) = vbTab Then W = "x"  
            A = A & DelimNeu &  W'weitere Felder mit vorangestelltem Delimiter hinzufügen  
        Next
        A = A & Zeilenende 'Zeilenendekennung anfügen  
    End If
Next
fso.CreateTextFile(Aus).Write Mid(A, 3)'Inhalt schreiben, führende Zeilenschaltung in Zeile 1 überspringen  
Grüße
bastla

BTW: Es sollte doch eigentlich nicht nötig sein, dass Biber für Dich die Formatierung (ja, die aus meinem ersten Kommentar oben) übernehmen muss ...
Member: Mit.ohne.Ahnung
Mit.ohne.Ahnung May 17, 2013 at 19:18:09 (UTC)
Goto Top
Hallo bastla, hallo Biber,

sorry, keine Absicht ..... kommt nicht mehr vor

und danke bastla .... läuft jetzt Perfekt ! !

Grüße Frank