AW: Text konvertierung mit Hindernissen
30.06.2004 09:36:47
Volker
Hallo Reinhard,
das file fängt so an:
Title: messung150604
Comment:
Date and Time: 06/15/2004 3:12:45 PM
Sample,channel 201,time(abs),channel 202,time(abs),channel 203,time(abs).......
0,46,0866547,0,40,6271629,10,038,40,4305611,20,084,42,8014297,30,124,41,8152771......
1,46,6730995,60,257,41,1663666,70,294,40,5197372,80,334,43,2661781,90,376,42,2356682...
2,47,0522156,120,497,41,5956268,130,536,40,9662933,140,576,44,0804672,150,616,42,7772598.
3,47,8301964,180,737,42,1212845,190,848,41,2016068,200,888,44,9593391,210,939,43,4601822.
4,....
5,
Das kann bis zu channel 240 (also 40 Datensätze pro Zeile) gehen und beliebig viele Zeilen haben.
Links steht die laufende Nr. 1....n, dann folgen jeweils Datensatz und Zeitstempel der Kanäle 1...n im Format dd,dddd,zz,zzz. Die Zeilen bis einschließlich der 0-ten
Messung werden gelöscht.
Mich interessieren nur die Daten, darum werden die Spalten mit den Zeitstempeln nach der Konvertierung ebenfalls gelöscht.
Zuerst wird das file ohne jede Konvertierung in excel geöffnet, dh. die kompletten Datensätze stehen in Spalte "A".
Meine Prozedur arbeitet jetzt jede Zeile ab und löscht jedes ungradzahlige Komma, also alle, die keine Dezimaltrennzeichen sind. Dann wird das ganze über die Standardfunktion
"Text in Tabelle"
Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _...........usw.
konvertiert und sieht dann so aus:
1|46,6730995|60,257|41,1663666|70,294|40,5197372|80,334|43,2661781|90,376|42,2356682...
....
Dann lösche ich die 3., 5., 7. usw. Spalte, die die nicht benötigten Daten enthalten.
Die string-operation mache ich so:
Public
Sub komma()
Dim pos, i, j, l As Integer
i = 1
While Cells(i, 1) <> ""
j = 0
l = 2
While l < Len(Cells(i, 1))
If Right(Left(Cells(i, 1), l), 1) = "," And j = 0 Then
Cells(i, 1) = Left(Cells(i, 1), l - 1) & " " & Right(Cells(i, 1), Len_
(Cells(i, 1)) - l)
j = 1
ElseIf Right(Left(Cells(i, 1), l), 1) = "," And j = 1 Then
j = 0
End If
l = l + 1
Wend
i = i + 1
Wend
Jeder String wird zeichenweise durchsucht, in zwei Teile vor und nach den ungeraden
Kommas zerlegt und mit einem Leerzeichen dazwischen wieder zusammengesetzt.
Variable j ist sozusagen Marker für gerade oder ungerade.
Etwas eleganter, aber auch nicht schneller, ist die Variante, alle Kommas in Punkte umzuwandel, die ungeraden Punkte durch Leerzeichen,
die geraden durch Kommas zu ersetzen.
Dabei liefert mir pos = InStr(Cells(i, 1), ".") direkt die Position des jeweils 1. Punktes im string.
Public
Sub komma()
Dim pos, i, k As Integer
Cells.Replace What:=",", Replacement:=".", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
i = 1
While Cells(i, 1) <> ""
pos = InStr(Cells(i, 1), ".")
k = 0
While pos <> 0
If k = 0 Then
Cells(i, 1) = Left(Cells(i, 1), pos - 1) & " " & _
Right(Cells(i, 1), Len(Cells(i, 1)) - pos)
k = 1
Else
Cells(i, 1) = Left(Cells(i, 1), pos - 1) & "," & _
Right(Cells(i, 1), Len(Cells(i, 1)) - pos)
k = 0
End If
pos = InStr(Cells(i, 1), ".")
Wend
i = i + 1
Wend
End Sub
So ich hoffe, ich hab Dich nicht mit Infos erschlagen, aber der Sytaxhighlighter funktioniert bei mir nicht, da muß ich immer etwas mehr erklären.
Vielen Dank im Voraus für deine Mühe.
Gruß
Volker