keksdieb
Goto Top

mehrere Leerzeichen mit einem Semikolon ersetzen

Die Daten einer Textdatei soll in eine Excel Tabelle geschrieben werden (mit VBScript).

Moin moin Community

Ich habe folgendes Problem:

Ein Programm erzeugt eine Textdatei in der bestimmte Daten stehen.
Hier ein kleines Beispiel:

Ort    03.04.2009 07:13:00                   757MZO KEY             0            10693,0031  1                                            33,38

das ganze ist aus Übersichtsgründen nur ein teil der Datei...

Das Übertragen der Daten aus der Textdatei in eine Excel Tabelle klappt bereits, allerdings habe ich das Problem, dass ich ein Trennzeichen benötige.
Also habe ich in meinem Script als Trennzeichen das Whitespace genommen, mit dem Ergebnis, dass der Export von vielen Zeilen enorm lange dauert und in der Exceltabelle zig leere Spalten sind.

Ersetze ich mit Replace alle Whitespaces mit einem Zeichen, dann rennt der Export zu Excel richtig schnell, dann habe ich aber ganz viele Kommas oder Semikolons in der Excel tabelle...

Meine Frage:
Hat jemand eine Idee, wie man die Leerzeichen zwischen den Datensätzen in ein Trennzeichen (z.B. ;) umwandeln kann?

Vielen Dank

/*Edit
Eventuell sollte ich das Script noch hochladen... face-smile
<code=plain>
If objFSO.FileExists(strDateiname) Then
'Excel starten und neue Arbeitsmappe erzeugen
Set appEx=WScript.CreateObject("Excel.Application")
appEx.Visible=True
Set objWB=appEx.Workbooks.Add()
Set objTab=objWB.Worksheets(1)
intZeile=1
intSpalte=1
'Datei öffnen
Set objTDatei=objFSO.OpenTextFile(strDateiname,ForReading)
'Datei lesen, Zeile für Zeile
Do While objTDatei.AtEndofStream=False
strZeile=objTDatei.ReadLine()
'Aufsplitten in Array
arrDaten=Split(strZeile,vbTab)
'Für jedes Array-Element Daten in
'Tabelle schreiben
For intSpalte=1 To UBound(arrDaten)+1
objTab.Cells(intZeile,intSpalte).value=arrDaten(intSpalte-1)
Next
intZeile=intZeile+1
Loop
objTDatei.Close
'Excel beenden und Datei schließen
objWB.SaveAs objFSO.BuildPath(strPfad,"export.xls")
objWB.Close
appEx.Quit
Else
MsgBox "Datei nicht vorhanden"
End If


Gruß keksdieb

Content-Key: 115413

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: WiSch
WiSch 06.05.2009 um 13:22:45 Uhr
Goto Top
Hallo keksdieb,

hier ein Ansatz: http://www.arstechnica.de/index.html?name=http://www.arstechnica.de/com ...

Damit werden schon mal alle Mehrfach-Leerzeichen in eines umgewandelt.
Dann bleibt noch das Problem die Korrektur auf ein Trennzeichen einzusetzen.

Aber ein Start sollte es auf jeden Fall schon einmal sein. face-wink
Mitglied: keksdieb
keksdieb 06.05.2009 um 14:05:58 Uhr
Goto Top
Hi AVEHilfe...

Vielen Dank

Man man, das ist genau das was ich gesucht habe...
Ich bin schwer begeistert und bedanke mich herzlichst bei dir für dein Engagment und Hilfe.

Super...!

ein hellauf begeisterter Keksdieb
Mitglied: WiSch
WiSch 06.05.2009 um 14:23:05 Uhr
Goto Top
Gerne.

Ich fänds gut, wenn Du das lauffähige Script hier noch postest... dann haben wir alle was davon.
Mitglied: keksdieb
keksdieb 06.05.2009 um 14:40:38 Uhr
Goto Top
Ja, du hast recht....

Hier das Script, so wie es bei mir läuft:
'--------- Variablen ------------  
Const strDATEI="Datei.txt"  
Const ForReading=1, ForWriting=2, ForAppending=8
Dim objFSO
Dim strPfad
Dim strDateiname
Dim objTDatei
Dim strAusgabe
Dim strZeile
Dim strTemp
Dim arrDaten
Dim intPos
Dim objWB 
Dim appEx
Dim objTab
Dim intZeile
Dim intSpalte
Dim strExcelDatei
'-------- Anweisungen -----------  
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")  
strPfad=objFSO.GetParentFolderName(WScript.Scriptfullname)
strDateiname=objFSO.BuildPath(strPfad,strDATEI) 

If objFSO.FileExists(strDateiname) Then
	'Excel starten und neue Arbeitsmappe erzeugen  
	Set appEx=WScript.CreateObject("Excel.Application")  
	appEx.Visible=True
	Set objWB=appEx.Workbooks.Add()
	Set objTab=objWB.Worksheets(1)
	intZeile=1
	intSpalte=1
	'Datei öffnen  
	Set objTDatei=objFSO.OpenTextFile(strDateiname,ForReading)
	'Datei lesen, Zeile für Zeile  
	Do 	While objTDatei.AtEndofStream=False
		strZeile = objTDatei.ReadLine()
		strZeile=LeerRed(strZeile)
		'Aufsplitten in Array  
		arrDaten=Split(strZeile," ")  
		'Für jedes Array-Element Daten in  
		'Tabelle schreiben  
		For intSpalte=1 To UBound(arrDaten)+1
			objTab.Cells(intZeile,intSpalte).value=arrDaten(intSpalte-1)
		Next
		intZeile=intZeile+1
	Loop  
	objTDatei.Close
	'Excel beenden und Datei schließen  
	strExcelDatei=InputBox("geben Sie den Dateinamen ein, unter dem der Export gespeichert werden soll:","Export Tankdaten Zeven","*.xls")  
	objWB.SaveAs objFSO.BuildPath(strPfad,strExcelDatei)
	objWB.Close
	appEx.Quit 
Else
	MsgBox "Datei nicht vorhanden"  
End If
Set appEx=Nothing
Set objWB=Nothing
Set objFSO=Nothing
'--- Prozeduren u. Funktionen ---  

'Funktion zum Entfernen der äußert überflüssigen Leerzeichen  
Public Function LeerRed(Zeichen)
    Dim Pos 
    If IsNull(Zeichen) Then Exit Function
    Zeichen = Trim(Zeichen)
    Pos = InStr(1, Zeichen, "  ") ' 2 Leerzeichen !!  
    While Pos <> 0
        Zeichen = Left(Zeichen, Pos) & Mid(Zeichen, Pos + 2)
        Pos = InStr(Pos, Zeichen, "  ")  
    Wend
    LeerRed = Zeichen
End Function

Ich habe einfach die Funktion mit beigefügt, die VBA Inhalte gelöscht und als Benutzerschmankerl noch eine Inputbox, in der der Anwender den Dateinamen angeben kann, unter der die Exceltabelle gespeichert werden soll...

Das Script läuft nur, wenn die .txt Datei und das Script im gleichen Verzeichnis liegen...!

Also, vielen Dank nochmal für deine Hilfe.
Gruß Keksdieb
Mitglied: 76109
76109 06.05.2009 um 15:25:01 Uhr
Goto Top
Hallo keksdieb,

So geht's noch etwas schneller:

Dim expDaten(8)

Do Until objTDatei.AtEndofStream
 
   impDaten = Split(objTDatei.ReadLine) ' Split default Leerzeichen  

    e = 1
    For i = 0 To UBound(impDaten)
        If impDatenx(i) <> "" Then expDaten(e) = impDaten(i):  e = e + 1  
    Next

    For intSpalte = 1 To UBound(expDaten)
        objTab.Cells(intZeile, intSpalte).Value = expDaten(intSpalte)
    Next
  
    intZeile = intZeile + 1

Loop



Gruß Dieter
Mitglied: 76109
76109 06.05.2009 um 17:30:59 Uhr
Goto Top
Hallo keksdieb,

Und so nochmal schneller:

Dim expDaten(7)

Do Until objTDatei.AtEndofStream
 
   impDaten = Split(objTDatei.ReadLine) ' Split default Leerzeichen  

   e = 0
   For i = 0 To UBound(impDaten)
       If impDaten(i) <> "" Then expDaten(e) = impDaten(i):  e = e + 1  
   Next

   With objTab
       .Range(.Cells(intZeile, 1), .Cells(intZeile, UBound(expDaten) + 1)) = expDaten
   With End
    
   intZeile = intZeile + 1

Loop

Gruß Dieter
Mitglied: keksdieb
keksdieb 11.05.2009 um 12:38:50 Uhr
Goto Top
ist ja witzig...

Dieter hat dazwischen gepostet und ich habe es übersehen... ^^

@ Dieter, vielen Dank auch für deine Denkanstöße, ich werde mal sehen, was ich optimieren kann und dann gegebenenfalls das optimierte Script posten...

Vielen Dank

Gruß Keks
Mitglied: 76109
76109 11.05.2009 um 13:14:14 Uhr
Goto Top
Hallo keksdieb,

Zitat von @keksdieb:
ist ja witzig...Dieter hat dazwischen gepostet und ich habe es übersehen... ^^

passiert mir ab und zu auch mal.face-smile


Gruß Dieter