PDA

Vollständige Version anzeigen : Zeilen aus Texdateien einlesen


wmakrist
14.09.2011, 16:16
Hallo zusammen

Ich versuche mein Problem mal zu beschreiben:

Ich habe eine ganze Menge Textdateine (.xml) die alle gleich aufgebaut sind. Ich müsste aus allen immer wieder die gleichen Zeilen auslesen (z.B. 5, 26, 48, 122 usw) und in ein Tabellenblatt spaltenweise schreiben.
Die Zeilen sind wie folgt aufgebaut (Bespiel):

<LengthMeter>49.5</LengthMeter>

Ich bräuchte da auch nur die 49.5

Ich hab schon mal ein bisschen Gegooglet und mit mal was zusammenkopiert und gebastelt. Soweit funktioniert das auch. Das Problem ist nur das Felder mehrfach mit dem gleichen Namen auftauchen und das geht auf die Art wie ich es probiert habe irgendwie nicht.

Hier meine Code:

Sub Sammeln()

Dim rngZelle As Range

Range("A1").Select

Ordner = "c:\temp\9999"
Dateityp = LCase("xml")
Felder = Array("<Date>", "<LengthMeter>")

MaxFeldIndex = UBound(Felder)
Dim FeldL() As Integer
ReDim FeldL(MaxFeldIndex)
For i = 0 To MaxFeldIndex
FeldL(i) = Len(Felder(i))
Next

Zeile = 2
Rows(CStr(Zeile) & ":65536").ClearContents

Set fso = CreateObject("Scripting.FileSystemObject")
For Each Datei In fso.GetFolder(Ordner).Files
If LCase(fso.GetExtensionname(Datei.Name)) = Dateityp Then
Daten = Datei.OpenAsTextStream.ReadAll
Cells(Zeile, 1) = fso.GetBaseName(Datei.Name)
For i = 0 To MaxFeldIndex
Pos = InStr(Daten, Felder(i))
If Pos > 0 Then
Wert = Replace(Split(Mid(Daten, Pos + FeldL(i)), vbCrLf)(0), vbTab, "/")
Cells(Zeile, i + 2).Value = Wert
End If
Next
Zeile = Zeile + 1
End If
Next

End Sub

Im Anhang ist eine Bespieltextdatei (wie gesagt eine XML). Ich hoffe ihr könnt damit was anfangen!

Gruß und Danke schon mal,
Andre

josef e
14.09.2011, 19:12
<div style="width:85%; margin-left:5px; margin-right:15px; text-align:justify;">
Hallo Andre,

statt deinem unverständlichen Code zu posten, solltest du vielleicht beschreiben, welche Werte du benötigst und wie diese in der Tabelle aufgeführt werden sollen.


</div>

<div style="width:100px; text-align:center; color:white; font-style:italic; font-size:0.8em; font-family:Tahoma; background-color:royalblue;margin-left:5px; margin-top:15px; padding:4px; border:3px double darkblue;">&laquo; Gru&szlig; Sepp &raquo;</div>

wmakrist
15.09.2011, 08:26
Moin

Sorry das der Code so komisch aussieht. Wie kann ich den vernünftig darstellen? Ich hab auch grade erst gesehen das das Beispiel (49.5) abgeschnitten wurde. Das muss heißen:

< LengthMeter >49.5< /LengthMeter >

Wie gesagt, ich brauche immer die gleichen Zeilen aus der Datei. Mein Problem ist halt das es Felder doppelt gibt (z.B. MarginMargin...MarginMargin, haben aber unterschiedliche Werte). Wenn es eindeutig wäre würde es mit meinem Code problemlos funktionieren.

Im ersten Feld der Zeile sollte der Dateiname stehen. Dann brauche ich erst mal folgende Zeilen:

11, 14, 17, 218, 222, 232, 233, 236, 237, 246, 250, 260, 264, 302

Und daraus nur den Wert zwischen den Bezeichnungen. Die Werte sollen einfach (sind ein paar Tausend) in einer Zeile stehen (Spaltenüberschrift bau ich mir da selber rein). Achja, es sollen auch alle Dateien die sich im Ordner befinden automatisch eingelesen werden (wird nach und nach befüllt). Super wäre auch noch wenn anhand des Dateinamens (erstes Feld) geprüft wird ob es den Eintrag schon gibt.

Hier noch mal der Code an dem ich mich bis jetzt versucht habe. Ich hoffe der ist jetzt besser zu entziffern ;)

Danke und Gruß,
Andre


Sub Sammeln()

Dim rngZelle As Range

Range("A1").Select

Ordner = "c:\temp\9999"
Dateityp = LCase("xml")
Felder = Array("< Date >", "< LengthMeter >", "< Name >", "< MarginMargin >", "< WorstMargin >", "< WorstMargin >")

MaxFeldIndex = UBound(Felder)
Dim FeldL() As Integer
ReDim FeldL(MaxFeldIndex)
For i = 0 To MaxFeldIndex
FeldL(i) = Len(Felder(i))
Next

Zeile = 2
Rows(CStr(Zeile) & ":65536").ClearContents

Set fso = CreateObject("Scripting.FileSystemObject")
For Each Datei In fso.GetFolder(Ordner).Files
If LCase(fso.GetExtensionname(Datei.Name)) = Dateityp Then
Daten = Datei.OpenAsTextStream.ReadAll
Cells(Zeile, 1) = fso.GetBaseName(Datei.Name)
For i = 0 To MaxFeldIndex
Pos = InStr(Daten, Felder(i))
If Pos > 0 Then
Wert = Replace(Split(Mid(Daten, Pos + FeldL(i)), vbCrLf)(0), vbTab, "/")
Cells(Zeile, i + 2).Value = Wert
End If
Next
Zeile = Zeile + 1
End If
Next

End Sub

josef e
15.09.2011, 23:06
<div style="width:85%; margin-left:5px; margin-right:15px; text-align:justify;">
Hallo Andre,

probiere mal diesen Code.

<div style="background-color:#F5F5F5; border-width:2px; border-style: groove; border-color:#ff9966; padding:4px;"><nobr><span style="font-family:Courier New,Arial; font-size:8pt ;" ><span style="color:#008000"; >' **********************************************************************</span><br /><span style="color:#008000"; >' Modul: Modul1 Typ: Allgemeines Modul</span><br /><span style="color:#008000"; >' **********************************************************************</span><br /><br /><span style="color:#00009B"; >Option</span> <span style="color:#00009B"; >Explicit</span><br /><br /><b><span style="color:#00009B"; >Sub</span> importXML()</b><br />&nbsp;&nbsp;<span style="color:#00009B"; >Dim</span> strFile <span style="color:#00009B"; >As</span> String, strPath <span style="color:#00009B"; >As</span> String, strTmp <span style="color:#00009B"; >As</span> <span style="color:#00009B"; >String</span><br />&nbsp;&nbsp;<span style="color:#00009B"; >Dim</span> lngRow <span style="color:#00009B"; >As</span> Long, lngCol <span style="color:#00009B"; >As</span> Long, lngindex <span style="color:#00009B"; >As</span> <span style="color:#00009B"; >Long</span><br />&nbsp;&nbsp;<span style="color:#00009B"; >Dim</span> FF <span style="color:#00009B"; >As</span> <span style="color:#00009B"; >Integer</span><br />&nbsp;&nbsp;<span style="color:#00009B"; >Dim</span> vntMatch <span style="color:#00009B"; >As</span> <span style="color:#00009B"; >Variant</span><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;vntMatch = Array(<span style="color:#800000"; >"Date"</span>, <span style="color:#800000"; >"LengthMeter"</span>, <span style="color:#800000"; >"Name"</span>, <span style="color:#800000"; >"MarginMargin"</span>, <span style="color:#800000"; >"WorstMargin"</span>)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;strPath = <span style="color:#800000"; >"E:\Forum"</span><br />&nbsp;&nbsp;strPath = IIf(Right(strPath, 1) = <span style="color:#800000"; >"\"</span>, strPath, strPath & <span style="color:#800000"; >"\"</span>)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#00009B"; >With</span> ActiveSheet<br />&nbsp;&nbsp;&nbsp;&nbsp;lngRow = Application.Max(2, .Cells(.Rows.Count).End(xlUp).Row + 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;lngCol = 2<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;strFile = Dir(strPath & <span style="color:#800000"; >"*.xml"</span>, vbNormal)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >Do</span> <span style="color:#00009B"; >While</span> strFile &lt;&gt; ""<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FF = FreeFile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >If</span> IsError(Application.Match(strPath & strFile, .Columns(1), 0)) <span style="color:#00009B"; >Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(lngRow, 1) = strPath & strFile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >If</span> .Cells(1, 1) = "" <span style="color:#00009B"; >Then</span> .Cells(1, 1) = <span style="color:#800000"; >"Filename"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >Open</span> strPath & strFile <span style="color:#00009B"; >For</span> <span style="color:#00009B"; >Input</span> <span style="color:#00009B"; >As</span> #FF<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >Do</span> <span style="color:#00009B"; >While</span> <span style="color:#00009B"; >Not</span> EOF(FF)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Line <span style="color:#00009B"; >Input</span> #FF, strTmp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTmp = Trim$(strTmp)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTmp = Replace(strTmp, <span style="color:#800000"; >"&lt;/"</span>, <span style="color:#800000"; >"&lt;"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >For</span> lngindex = 0 <span style="color:#00009B"; >To</span> <span style="color:#00009B"; >UBound</span>(vntMatch)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >If</span> Left(strTmp, Len(vntMatch(lngindex)) + 2) = <span style="color:#800000"; >"&lt;"</span> & vntMatch(lngindex) & <span style="color:#800000"; >"&gt;"</span> <span style="color:#00009B"; >Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTmp = Replace(strTmp, <span style="color:#800000"; >"&lt;"</span> & vntMatch(lngindex) & <span style="color:#800000"; >"&gt;"</span>, "")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(lngRow, lngCol) = strTmp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >If</span> .Cells(1, lngCol) = "" <span style="color:#00009B"; >Then</span> .Cells(1, lngCol) = vntMatch(lngindex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngCol = lngCol + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >End</span> <span style="color:#00009B"; >If</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >Loop</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >Close</span> #FF<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngRow = lngRow + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngCol = 2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >End</span> <span style="color:#00009B"; >If</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strFile = Dir<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#00009B"; >Loop</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#00009B"; >End</span> <span style="color:#00009B"; >With</span><br /><b><span style="color:#00009B"; >End</span> <span style="color:#00009B"; >Sub</span></b><br /><br /></span></nobr></div>


</div>

<div style="width:100px; text-align:center; color:white; font-style:italic; font-size:0.8em; font-family:Tahoma; background-color:royalblue;margin-left:5px; margin-top:15px; padding:4px; border:3px double darkblue;">&laquo; Gru&szlig; Sepp &raquo;</div>

wmakrist
16.09.2011, 09:03
Moin Sepp

Hey das ist doch schon mal prima, sind jetzt zwar zu viele Werte aber das sollte nich das Problem sein, ich kann ja die Spalten löschen die ich nicht brauche. Ich hab sowieso noch keine Info welche genau gebraucht werden. Da muss ich noch mal nachforschen. Soweit ist das also schon mal super.

Falls noch was ist, würde ich mich dann noch mal melden! ;)

Dazu aber noch ne kurze Frage, kann man das nicht Zeilenweise auslesen? Z.B. immer Zeile 5, 24, 58, 139?

Danke Dir für deine Mühe!!! :D

Gruß,
Andre

wmakrist
16.09.2011, 10:46
Hiho

Hab schon das nächste Problem :) Geht es das die Daten als Text eingelesen werden? Beim importieren wird leider das Datum falsch dargestellt. Ich weiß jetzt auch welche Daten ich brauche. Da stellt sich aber ein weiteres Problem. Nach "Beschneidung" der Daten die ich nicht benötige, ergibt sich eine Zeile wie folgt:

- Die Daten unterteilen sich in 4 Blöcke a 3 Felder

57902 (wie kann ich die Bilder größer Anzeigen???)

- Es soll nun die Blöcke anhand des dritten Wertes miteinander verglichen werden

57903

und der gesamt Block mit dem niedrigsten Wert in die erste freie Zelle der jeweiligen Spalte kopiert werden

57904

Und das für die gesamt Tabelle mit x-Zeilen!!!

Ich hoffe das ist einigermaßen verständlich was ich meine. :)

Danke und Gruß,
Andre