Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1532to1536
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Textdatei filtern vor dem Import in Excel

Textdatei filtern vor dem Import in Excel
06.01.2017 20:56:18
Daniel
Hallo zusammen,
ich habe ein Problem beim Import einer Datei in Excel mittels VBA. Es soll eine .wrl Datei importiert werden. Diese enthält einen VRML-Code der eine CAD-Geometrie beschreibt.
Ich muss in Excel gewisse Datensätze aus dieser Datei herausfilterm. Dies funktioniert alles perfekt.
Allerdings stoße ich bei den Dateien zu schnell an die maximale Excel-Zeilenanzahl von 1.048.576 Zeilen. Um dies zu verhindern möchte ich während dem Import in Excel bereits unnötige Zeilen mit dem Eintrag "}" herausfiltern. Somit hätte ich wieder mehr Zeilen zur Verfügung.
Könnt ihr mir bitte sagen, wie ich das machen kann? Den Import habe ich bis jetzt immer über eine QueryTable gemacht.
Zur Hilfe hier ein Auszug aus der Textdatei mit dem VRML-Code:
#################################################################
#VRML V2.0 utf8
WorldInfo {
info [ "File created using CATIA" ]
}
NavigationInfo {
type [ "EXAMINE" , "WALK" , "FLY" ]
}
Background {
skyColor [ 0 0 0 ]
}
Viewpoint {
position 0.292005 -0.057631 0.528195
orientation 0.324899 0.500860 0.802234 2.180746
fieldOfView 0.471225
description "Main Viewpoint"
}
Viewpoint {
position 0.182439 0.037762 0.590353
orientation 0.187053 0.451587 0.872399 2.448076
fieldOfView 0.471225
description "Iso View"
}
##########################################################
Danke!!
Gruß Daniel

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Textdatei filtern vor dem Import in Excel
06.01.2017 21:24:23
Michael
Hi Daniel,
vielleicht sagst Du uns lieber, welche Zeilen bzw. Informationen Du benötigst?
Was für weitere "Datentypen" (außer Viewpoint) kommen noch vor?
Wäre Dir damit geholfen, daß man die Datei durch einen "Präprozessor" jagt, der alle Infos zu jedem einzelnen "Datum" in eine einzige Zeile steckt? Also etwa so:
Viewpoint {position 0.292005 -0.057631 0.528195 orientation 0.324899 0.500860 0.802234 2.180746
fieldOfView 0.471225 description "Main Viewpoint"}
(halt EINE Zeile)
In dem Zug könnte man auch Begriffe abkürzen, z.B. "p" statt "position", falls es hilft, oder, falls die Struktur immer identisch ist, gleich alle Begriffe rauswerfen.
Schöne Grüße,
Michael
Anzeige
AW: Textdatei filtern vor dem Import in Excel
07.01.2017 15:29:05
Daniel
Hallo Michael,
Danke für die sehr schnelle Antwort!
Im Laufe der Datei kommen noch "Datentypen" vom Typ "IndexedLineTyp" vor. Diese Information beschreibt Linien in der CAD Geometrie.
Die Koordinaten beschreiben den Anfangspunkt der Linie mit X Y und Z. Darunter befinden sich die Koordinaten des Endpunktes mit X Y Z.
Mein Makro errechnete daraus die Abweichungen dx dy und dz und generierte eine neue Tabelle mit diesen Informationen. Dazu war es beim Import wichtig, nicht alles in eine Zelle zu schreiben, sondern mittels Leerzeichen die Informationen auf mehrere Spalten aufzuteilen.
Dazu benutzte ich die QueryTable, was auch echt gut funktionierte, wenn die Zeilenbegrenzung nicht da wäre.
Ich hoffe ich konnte das Problem noch ein bissche besser beschreiben. Zur Veranschaulichung noch solch eine Linieninformation mit zwei Linien. Die Zahlen beschreiben die besagten Koordinaten in X Y und Z, welche ich subtrahieren, kopieren und zusammenschreiben muss.
Danke!
####################################################
}
geometry IndexedLineSet {
coord Coordinate {
point [
1116.04 303.527 1021,
1115.83 303.783 1020.72,
]
}
coordIndex [0 1 -1,]
}
}
Shape {
appearance Appearance {
material USE _material1
}
geometry IndexedLineSet {
coord Coordinate {
point [
1187.94 281.251 1008.5,
1188.02 281.53 1007.64,
]
}
coordIndex [0 1 -1,]
}
}
#####################################################################
Anzeige
AW: Textdatei filtern vor dem Import in Excel
07.01.2017 16:29:46
Daniel
Hi
probier mal das:
der folgende Code liest die Datei als ganzes ein und teilt ihn Zeilenweise auf ein Array (ich hoffe der Speicherplatz reicht)
dann werden in ein neues Array die Zeilen mit einem Inhalt länger als ein Zeichen geschrieben und so die Zeilen gekürzt.
dann wird dieses neue Array nochmal so aufbereitet, dass man es direkt in die Zellen schreibne kann und die Werte werden übertragen.
hinterher kanns du dann mit TEXT IN SPALTEN deine Werte noch in Spalten splitten:

Public Sub Einlesen()
Dim FSO As Object
Dim txtDatei As Object
Dim stext As String
Dim arr As Variant
Dim arrGekürzt
Dim z1 As Long, z2 As Long
Set FSO = CreateObject("Scripting.FilesystemObject")
Set txtDatei = FSO.opentextfile("C:\Users\Daniel\Downloads\text.txt") 'Öffnen
stext = txtDatei.readall 'Lesen
txtDatei.Close 'Schließen
arr = Split(stext, vbCrLf) 'In Zeilen aufteilen
ReDim arrGekürzt(0 To UBound(arr))
For z1 = 0 To UBound(arr)
If Len(arr(z1)) > 1 Then
arrGekürzt(z2) = arr(z1)
z2 = z2 + 1
End If
Next
ReDim arr(1 To z2, 1 To 1)
For z1 = 0 To z2 - 1
arr(z1 + 1, 1) = arrGekürzt(z1)
Next
Cells(1, 1).Resize(z2, 1).Value = arr
End Sub
sollten es nach dem kürzen immer noch mehr als 1,04 Mio Zeilen sein, könnte man das ganze auch so umschreiben, dass dann der Inhalt auf mehrere Blätter verteilt wird.
Gruß Daniel
Anzeige
AW: Textdatei filtern vor dem Import in Excel
07.01.2017 19:06:50
Daniel
Hey Daniel!
Vielen vielen Dank für deine Hilfe! Das Makro macht eigentlich genau das was es soll. Allerdings bräuchte ich noch bei dem splitten in Spalten etwas Hilfe von dir. So wie es jetzt ist wird ja alles in die erste Zelle geschrieben.
Wie schaffe ich es jetzt noch dass er bei jedem Leerzeichen in die nächste Spalte springt?
Die Methode mit den mehreren Tabellen habe ich mir auch schon überlegt. Das wäre eine sehr gute Möglichkeit, da ich dann wieder mit der QueryTable arbeiten kann und die Aufteilung in mehrere Spalten und Dezimaltrennzeichen einfach definieren kann. Allerdings weiß ich da nicht wie ich es gestalten soll, dass er nach den 1,04 Mio Zeilen auf die nächste Tabelle springt.
Ich wäre dir sehr dankbar wenn du mir da nochmal helfen könntest!
Danke!
Gruß Daniel
Anzeige
AW: Textdatei filtern vor dem Import in Excel
07.01.2017 21:49:34
Daniel
Hi
nach dem Einfügen (also nachdem dieses Makro gelaufen ist), einfach noch die Funktion DATEN - DATENTOOLS - TEXT IN SPALTEN ausführen.
Wenns ins Makro rein soll, kannst dir ja vom Recorder helfen lassen, den entsprechenden Code zu erstellen.
hier der Code zum aufteilen auf mehrere Blätter:
Public Sub Einlesen()
Dim FSO As Object
Dim txtDatei As Object
Dim stext As String
Dim arr As Variant
Dim arrGekürzt
Dim z1 As Long, z2 As Long, z3 As Long
Set FSO = CreateObject("Scripting.FilesystemObject")
Set txtDatei = FSO.opentextfile("C:\Users\Daniel\Downloads\text.txt") 'Öffnen
stext = txtDatei.readall 'Lesen
txtDatei.Close 'Schließen
arr = Split(stext, vbCrLf) 'In Zeilen aufteilen
ReDim arrGekürzt(0 To UBound(arr))
For z1 = 0 To UBound(arr)
If Len(arr(z1)) > 1 Then
arrGekürzt(z2) = arr(z1)
z2 = z2 + 1
End If
Next
z3 = 1
ReDim arr(1 To WorksheetFunction.Min(ActiveSheet.Rows.Count, z2), 1 To 1)
For z1 = 0 To z2 - 1
If z3 > UBound(arr, 1) Then
Worksheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Cells(1, 1).Resize(UBound(arr, 1), 1).Value = arr
ReDim arr(1 To UBound(arr, 1), 1 To 1)
z3 = 1
End If
arr(z3, 1) = arrGekürzt(z1)
z3 = z3 + 1
Next
Worksheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Cells(1, 1).Resize(UBound(arr, 1), 1).Value = arr
End Sub
das mit dem Text in spalten überlass ich dir, da steckt ja keine große Logik dahinter, das lässt sich mit dem Recoder aufzeichnen.
den Code musst du dann aber immer dann einfügen, wenn der Array-Inhalt in das blatt geschrieben wurde, also 2x, dh einmal in der Schleife und einmal am Ende.
Gruß Daniel
Anzeige
AW: Textdatei filtern vor dem Import in Excel
08.01.2017 10:54:18
Daniel
Hey!
Vielen Dank! Jetzt weiß ich was du meinst. Das bekomme ich auf jeden Fall hin. Da nehme ich dann doch den Recorder zur Hilfe.
Ich hatte nicht direkt an die Funktion gedacht aber macht ja Sinn. Ich probiere heute und morgen mal alles detailliert aus und denke dass ich damit auch zum Ziel komme. Ihr habt mir hier wahnsinnig viel geholfen. Danke dafür!
Gruß
Daniel
das hört sich ja überschaubar an
07.01.2017 21:11:25
Michael
Hi,
sorry, ich habe mich heute nachmittag "verexcelt".
Aaalso: wenn es nicht mehr als die paar "Datentypen" gibt, sollte es doch möglich sein, den Text direkt einzulesen (das, was Daniel inzwischen vorexerziert hat: Datei als String) und mit split() häppchenweise weiterverarbeiten, d.h. die Daten direkt in ein mehrspaltiges Ausgabe-Array schreiben.
Das ist ja dann im Prinzip das, was Dein offensichtlich vorhandenes, bisheriges Makro macht (Deltas ausrechnen usw.).
Ich denke, wenn Du das greifbar machst samt einer kleinen Beispieldatei (die aber alle Eventualitäten enthalten sollte), läßt sich das relativ schnell programmieren.
Ach so: was ist den shape und coordindex?
Schöne Grüße,
Michael
Anzeige
AW: Textdatei filtern vor dem Import in Excel
08.01.2017 10:50:18
Daniel
Hallo Michael,
vielen Dank! Ihr habt nir schon viel weiter geholfen. Ich werde mich heute und morgen mal noch dran setzen und es so versuchen wie ihr gesagt habt. Das sollte eigentlich so super klappen.
Zu deiner Frage:
Der begriff Shape beschreibt in der VRML einen Hauptknoten. Darunter wird mit Appearance wieder engezeigt, dass der Hauptknoten zwei Unterknoten besitzt.
Mit der Information im coordIndex ergibt sich dann mittels der Unterknoten eine Linie zwischen den Unterknoten. Diese ist in diesem Fall eine lineare, "gerade" Linie.
Gruß Daniel
AW: Textdatei filtern vor dem Import in Excel
10.01.2017 16:57:53
Daniel
Hallo zusammen,
das Makro läuft super und macht auch echt was ich mir vorgestellt habe. Ich habe nur noch ein Problem beim aufteilen der Spalten. Die Funktion "Text in Spalten" funktioniert zwar in Excel, ist aber eine Excel-spezifische Funktion. Da ich das Makro unteranderem in Catia ausführen will, brauch ich da eine Alternative. Meine Idee war jetzt, das Array mithilfe einer QueryTable einzufügen. Geht das?
Über diese Einstellungen möchte ich das Array in das Tabellenblatt einfügen:
####################################
With excel1.Sheets("Import").QueryTables.Add(Connection:=Dat1, Destination:=excel1.Sheets("Import").Range("$A$1"))
.Name = "temp.txt"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = False
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)
.TextFileDecimalSeparator = "."
.TextFileThousandsSeparator = " "
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
######################################################################
Welche Alternative gibt es zu der Funktion "Text in Spalten" in Excel?
Danke!
Gruß
Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige