marcoit
Goto Top

Per VBScript eine .txt Datei auslesen

Ich habe eine .txt Datei, die durch auslesen einer PDF entstanden ist, und möchte die Informationen/Daten aus der .txt in eine XML schreiben.
Die .txt wird erzeugt durch ein Programm Planet Press, das PDF´s auslesen kann.

Hallo erstmal Zusammen,

ich habe folgendes Problem:

Ich habe vor mit einem VBscript eine .txt nach Informationen zu durchsuchen, die anschließend in eine XML eingeschrieben werden sollen.
Meine .txt Datei erhalte ich dadurch, dass ein sogenannter Workflow (Planet Press Suite 7 vllt. bekannt) eine PDF (in dem Fall eine Rechnung)
den Text als String in diese .txt schreibt. Das funktioniert so weit alles wunderbar jedoch, kann ich in dem Planet Press Workflow auch einen VBScript
einbeten. das benötige ich da ich keinerlei Möglichkeit habe mit Planet Press, eine XML zu erstellen bzw. Infos aus der .txt Datei in die XML schreiben.
Also habe ich mir gedacht betten wir einfach einen VBScript ein... leichter gesagt als getan.

Ich habe bereits soweit, dass ich eine XML erstellen lasse, dort sich meine Struktur befindet und ich auf die .txt Datei zugreifen kann (Script folgt).
Jedoch erhalte ich erstens: keinerlei Text aus der .txt Datei und zweitens: wird mein Ltrim auch nicht so durchgeführt so wie ich es gerne hätte.
Und nun dachte ich vllt. kann mir ein VBScript-Profi helfen da ich mich gerade erst neu eingelernt habe in VBS und ich nicht weiter weis.

 Set oFS = CreateObject("Scripting.FileSystemObject")  
 
 Const strXmlFile = "Rechnung.xml"  
 Const source = "Rechnungsname.txt"  
 dim zeile,myLine
 Set objXMLFile = oFS.OpenTextFile(strXmlFile, 2, True, 0)
 
  objXMLFile.WriteLine "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>"  
  objXMLFile.WriteLine "<?xml-stylesheet type=""text/xsl""?>"  
  objXMLFile.WriteLine "<Dokument>"  
  
 Set file = oFS.GetFile(source)
 Set line = file.OpenAsTextStream(1,TristateUseDefault)
    
  Do While line.AtEndOfStream <> True
   myLine = Split(line.ReadLine," - ")  
   
	key = myline(0)
	wert = myline(1)
	Call CreateXML (key,wert)
    zeile = LTrim(line.readline)
	if (i = 17) then
		myLine = Split(zeile," - ")   
	end if
  Loop
	
 Call CloseXML()
 
 Function CreateXML(key,wert)
 
  if (key = "Kundenname") then  
    objXMLFile.WriteLine vbTab & "<Dokument>"  
    objXMLFile.WriteLine vbTab & vbTab & "<DocumentName>" & strXmlFile & "</DocumentName>"  
    objXMLFile.WriteLine vbTab & "<Adr>"  
    objXMLFile.WriteLine vbTab & vbTab & "<Name>" &  wert & "</Name>"  
  end if
  objXMLFile.WriteLine vbTab & vbTab & "<Company>" & wert & "</Company>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Street>" & wert  & "</Street>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Zip>" &wert  & "</Zip>"  
  objXMLFile.WriteLine vbTab & vbTab & "<City>" & wert & "</City>"  
  objXMLFile.WriteLine vbTab & "<Phone>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Work>" & wert & "</Work>"  
  objXMLFile.WriteLine vbTab & "</Phone>"    
  objXMLFile.WriteLine vbTab & "<Fax>"    
  objXMLFile.WriteLine vbTab & vbTab & "<Work>" & wert & "</Work>"  
  objXMLFile.WriteLine vbTab & "</Fax>"  
  objXMLFile.WriteLine vbTab & "</Adr>"  
  'Ende Anschrift'  
  
  objXMLFile.WriteLine vbTab & "<Taxnum>" & wert & "</Taxnum>"  
  'Ende Steuernummer'  
  
  'Kundenanschrift'  
  objXMLFile.WriteLine vbTab & "<Customer>"  
  objXMLFile.WriteLine vbTab & "<Addr>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Name>" &wert  & "</Name>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Street>" & wert & "</Street>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Zip>" &wert  & "</Zip>"  
  objXMLFile.WriteLine vbTab & vbTab & "<City>" &wert  & "</City>"  
  objXMLFile.WriteLine vbTab & "</Addr>"  
  objXMLFile.WriteLine vbTab & "</Customer>"  
  'Ende Kundenanschrift'  
  
  'Rechnungsdaten'  
  objXMLFile.WriteLine vbTab & vbTab & "<Date>" &wert  & "</Date>"  
  objXMLFile.WriteLine vbTab & vbTab & "<BillID>" &wert  & "</BillID>"  
  objXMLFile.WriteLine vbTab & vbTab & "<OrderID>" & wert & "</OrderID>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Curr>" & wert & "</Curr>"  
  'Ende Rechnungsdaten'  
  
  'Artikel'  
  objXMLFile.WriteLine vbTab & "<Item>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Number>" &wert  & "</Number>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Count>" &wert  & "</Count>"  
  objXMLFile.WriteLine vbTab & vbTab & "<CUnit>" &wert  & "</CUnit>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Id>" &wert  & "</Id>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Name>" &wert  & "</Name>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Price>" &wert  & "</Price>"  
  objXMLFile.WriteLine vbTab & vbTab & "<LumpSum>" & wert & "</LumpSum>"  
  objXMLFile.WriteLine vbTab & vbTab & "<Currency>" & wert & "</Currency>"  
  objXMLFile.WriteLine vbTab & "</Item>"  
  'Ende Artikel'  
  
  objXMLFile.WriteLine vbTab & "</Dokument>"  
 End Function
 
 Function CloseXML()
  wscript.echo "XML wurde erfolgreich erstellt"  
 End Function


Ich hoffe Ihr könnt mir helfen!

Mit freundlichen Grüßen
Marco

Content-ID: 157069

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

Ausgedruckt am: 25.11.2024 um 21:11 Uhr

Xaero1982
Xaero1982 15.12.2010 um 17:05:54 Uhr
Goto Top
Moin

Code tags sind "<'code'> und <'/code'>" (ohne ')

Ehm, ich sehe nicht wo du die txt öffnest?! Wo soll er denn da auch was auslesen?

VG
MarcoIT
MarcoIT 15.12.2010 um 17:09:41 Uhr
Goto Top
Sorry.. musste aus Sicherheitsgründen den Namen ändern und habe vergessen den Dateityp dazuzuschreiben.

Wegen Code: Ändere ich gleich mal! Danke face-wink
76109
76109 15.12.2010 um 19:23:15 Uhr
Goto Top
Hallo MarcoIT!

Dein VBS-Code ergibt so keinen Sinn. Von daher erkläre mal, wie die Text-Datei aufgebaut ist?

Enthält jede Zeile einen Kunden und mehrere '-' (Spalten)?

Und was soll die Codezeile 23 darstellen?

Gruß Dieter
MarcoIT
MarcoIT 16.12.2010 um 08:29:46 Uhr
Goto Top
Guten Morgen Didi!

Also die Textdatei erhält den Textinhalt der PDF. Er generiert die Textdatei so, dass der gesamte Inhalt der PDF im Prinzip einfach rüberkopiert wird. Dabei ist allerdings das Problem entstanden, dass sich extrem viele Leerzeilen befinden und auch des öfteren sich mal Inhalte eine Zeile nach unten verschieben.
Hier eine kleine Vorschau mit geänderten Inhalt:

<text>


Hier befindet sich eigentlich das Logo
Hier das was unter dem Logo steht.


Anschrift des Rechnungssenders
Rechnung Original
Name Rechnungsempfängers
Weiterer Name des Rechnungsempfängers
Beleg-Nr.:
Straße
Kunden-Nr.:
Datum 25.11.2010
D-PLZ und Ort
Ust.-ID.: DE


Sachbearbeiter:
Telefon:
Telefax:
Bestell-Nr.:
Best.-Datum: 18.11.2010
Lieferanschrift:

Lieferanschrift
Auftrags-Nr.: / 18.11.2010
Lieferschein-Nr.: / 24.11.2010 -------------------------Sachbearbeiter
Leistungsdatum: 24.11.2010-----------------------------Tel.:
Versandart: GLS --------------------------------- Straße
frei Haus, inkl. Verpackung

</text>

So sieht es aus. Es steht immer der Rechnungssender und -Empfänger in der Textdatei und dieser Text den ich hier eingefügt habe ist auch so mit Leerzeichen versehen. Deswegen auch mein LTrim.
Zu Zeile 23:
Da habe ich gestern ein wenig ausprobiert, dass wenn in Zeile 17 sich die Anschrift befindet, soll diese in den Speicher genommen werden, war aber noch nicht fertig und habe zeitnah den Code hier reinkopiert.

Ich hoffe ich konnte dir deine Fragen beantworten.
Guten Start in den Donnerstagmorgen.

Gruß Marco

PS: Nach dem ich den Beitrag hier gespeichert habe, sehe ich das Leerzeichen automatisch gelöscht werden.... ich werde einfach statt Leerzeichen - einfügen so das du dir ein Bild machen kannst.
Biber
Biber 16.12.2010 um 13:13:44 Uhr
Goto Top
[OT]
Moin MarcoIT,


Zitat von @MarcoIT:
PS: Nach dem ich den Beitrag hier gespeichert habe, sehe ich das Leerzeichen automatisch gelöscht werden.... ich werde
einfach statt Leerzeichen - einfügen so das du dir ein Bild machen kannst.
Weniger Aufwand hättest du gehabt, wenn du den Text in Code-Tags (evtl. mit der Zusatzangabe "code type=plain" ) gepostet hättest.
Diese Formatierung lässt auch die führenden Leerzeichen unverändert.

Grüße
Biber
[/OT]
76109
76109 18.12.2010 um 13:22:11 Uhr
Goto Top
Hallo Marco!

Hat leider etwas länger gedauertface-wink

Das Ganze ist immernoch ziemlich unklar (unterschiedliche Zeilenanzahl, unvollständig usw.). Um eine brauchbare Lösung zu finden, müsstest Du schon ein präziseres Beispiel mit fiktiven Daten in Code-Tags (< code>Quelltext< /code>) posten.

Bei diesem Code, wird die Import-Text-Datei in ein neues Text-Array geschrieben und zu Testzwecken in einer neuen Export-Text-Datei ausgegeben, was die Auswertung etwas erleichtern sollte? Konstanten entsprechend anpassen:
    Const ExportPath = "E:\Test\Export.txt"  
    Const ImportPath = "E:\Test\Import.txt"  

    Dim Fso, File, Text, Zeile, TextZeile, TextPos, NewText, i
    
    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    Set File = Fso.OpenTextFile(ImportPath)
    
   'Import-Textzeilen in Array einlesen  
    Text = Split(File.ReadAll, vbCrLf):  File.Close
    
   'Export-Text-Array definieren (+10 steht für mehr als 1 Eintrag pro Zeile)  
    ReDim NewText(UBound(Text) + 10)
    
   'Export-Textzeilen-Zähler definieren (Start = Item 0)  
    i = 0
    
   'Import-Textzeilen durchlaufen  
    For Each Zeile In Text
        
       'Leerzeichen in Textzeile entfernen  
        TextZeile = Trim(Zeile)
        
       'Test Leerzeile  
        If TextZeile <> "" Then  
            
           'Text-Position wenn Anzahl Leerzeichen >= 3 ermitteln (2 Einträge in Textzeile)  
            TextPos = InStr(TextZeile, "   ")  
            
           'Test Anzahl Leerzeichen >= 3 (2 Einträge in Textzeile)  
            If TextPos > 0 Then
                
               '1. Eintrag in New-Text-Array schreiben  
                NewText(i) = Mid(TextZeile, 1, TextPos - 1)
                
               '2. Eintrag in New-Text-Array schreiben  
                NewText(i + 1) = Trim(Mid(TextZeile, TextPos)):  i = i + 2
            Else
               'Nur einen Eintrag in New-Text-Array schreiben  
                NewText(i) = TextZeile:  i = i + 1
            End If
        End If
    Next
    
   'Export-Datei erstellen/überschreiben  
    Set File = Fso.CreateTextFile(ExportPath)
    
   'New-Text-Array in Export-Datei schreiben  
    File.Write Join(NewText, vbCrLf): File.Close
Ergebnis anhand Deines Beispiels:
Hier befindet sich eigentlich das Logo
Hier das was unter dem Logo steht.
Anschrift des Rechnungssenders
Rechnung Original
Name Rechnungsempfängers
Weiterer Name des Rechnungsempfängers
Beleg Nr.:
Straße
Kunden Nr.:
Datum 25.11.2010
D PLZ und Ort
Ust. ID.: DE
Sachbearbeiter:
Telefon:
Telefax:
Bestell Nr.:
Best. Datum: 18.11.2010
Lieferanschrift:
Lieferanschrift
Auftrags Nr.: / 18.11.2010
Lieferschein Nr.: / 24.11.2010
Sachbearbeiter
Leistungsdatum: 24.11.2010
Tel.:
Versandart: GLS
Straße
frei Haus, inkl. Verpackung
Hilft Dir das irgendwie weiter?

Und der Ablauf in etwa so:
Const XmlFolder = "E:\Test\"  
Const XmlFile = "Test.Xml"  

Const adTypeText = 2
Const adSaveCreateOverWrite = 2

'Xml-Array definieren  
 Dim Values(23), i
    
'Xml-Array mit "" (Leer-Text) initialisieren  
 For i = 0 To UBound(Values):  Values(i) = "":  Next  
    
'Verfügbare Werte ermitteln und in die entsprechende Value-Nr. schreiben (siehe Xml-Text)  
 Values(0) = "Wert 0"  
 Values(5) = "Wert 5"  
'....  
    
'Xml-File erstellen  
 Call CreateXmlFile(XmlFile, Values)

'Xml-File im UTF8-Format erstellen  
Sub CreateXmlFile(ByRef XmlName, ByRef Values)
    Dim Text
    
    Text = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>" & vbCrLf  
    Text = Text & "<?xml-stylesheet type=""text/xsl""?>" & vbCrLf  
   'Beg Dokument  
    Text = Text & vbTab & "<Dokument>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<DocumentName>" & XmlName & "</DocumentName>" & vbCrLf  
   'Anschrift  
    Text = Text & vbTab & "<Adr>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Name>" & Values(0) & "</Name>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Company>" & Values(1) & "</Company>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Street>" & Values(2) & "</Street>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Zip>" & Values(3) & "</Zip>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<City>" & Values(4) & "</City>" & vbCrLf  
    Text = Text & vbTab & "<Phone>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Work>" & Values(5) & "</Work>" & vbCrLf  
    Text = Text & vbTab & "</Phone>" & vbCrLf  
    Text = Text & vbTab & "<Fax>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Work>" & Values(6) & "</Work>" & vbCrLf  
    Text = Text & vbTab & "</Fax>" & vbCrLf  
    Text = Text & vbTab & "</Adr>" & vbCrLf  
   'Steuernummer  
    Text = Text & vbTab & "<Taxnum>" & Values(7) & "</Taxnum>" & vbCrLf  
   'Kundenanschrift  
    Text = Text & vbTab & "<Customer>" & vbCrLf  
    Text = Text & vbTab & "<Addr>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Name>" & Values(8) & "</Name>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Street>" & Values(9) & "</Street>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Zip>" & Values(10) & "</Zip>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<City>" & Values(11) & "</City>" & vbCrLf  
    Text = Text & vbTab & "</Addr>" & vbCrLf  
    Text = Text & vbTab & "</Customer>" & vbCrLf  
   'Rechnungsdaten  
    Text = Text & vbTab & vbTab & "<Date>" & Values(12) & "</Date>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<BillID>" & Values(13) & "</BillID>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<OrderID>" & Values(14) & "</OrderID>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Curr>" & Values(15) & "</Curr>" & vbCrLf  
   'Artikel  
    Text = Text & vbTab & "<Item>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Number>" & Values(16) & "</Number>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Count>" & Values(17) & "</Count>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<CUnit>" & Values(18) & "</CUnit>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Id>" & Values(19) & "</Id>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Name>" & Values(20) & "</Name>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Price>" & Values(21) & "</Price>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<LumpSum>" & Values(22) & "</LumpSum>" & vbCrLf  
    Text = Text & vbTab & vbTab & "<Currency>" & Values(23) & "</Currency>" & vbCrLf  
    Text = Text & vbTab & "</Item>" & vbCrLf  
   'End Dokument  
    Text = Text & vbTab & "</Dokument>" & vbCrLf  
    
    With CreateObject("ADODB.Stream")  
        .Type = adTypeText
        .Charset = "UTF-8"  
        .Open
        .WriteText Text
        .SaveToFile XmlFolder & XmlName, adSaveCreateOverWrite
        .Close
    End With
End Sub

Gruß Dieter
MarcoIT
MarcoIT 20.12.2010 um 08:33:59 Uhr
Goto Top
Morgen Didi,

ich versuch mal bin Heute erst wieder im Büro gewesen! Danke dir schonmal für deine Arbeit!
Ich melde mich sobald ich das mal versucht habe!

Gruß Marco
MarcoIT
MarcoIT 20.12.2010 um 10:41:48 Uhr
Goto Top
Super Danke dir!!!

Das "Problem" ist gelöst!

Danke an alle!

Schöne Urlaubstage und ein schönes Weihnachten zusammen. Rutsch auch gut ins neue Jahr!

Euer Marco!