Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1184to1188
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

Textfile bearbeiten

Textfile bearbeiten
Ralf_P
Hallo zusammen,
ich möchte aus xbelibiegen txt files die Zahlenwerte auslesen, dann die Zahlenwerte berechnen (z.B. Wert mal 5) und dann das Ergebnis in die entsprechende Zeile zurückschreiben.
Alle txt files sind nach der gleichen Struktur aufgebaut, so dass das über eine Schleife gehen müsste.
Hier mal ein Beispiel - es sollen die Zahlen in Zeile 1, 2 und 4 verändert und zurückgeschrieben werden:
Fzgmasse [t] 150.800
Reibmasse [t] 119.300
Haftreibungswert 1.000
Rhofzg (-) 4.540
Wirkgrad_konst 0.82000
Ich dachte an etwas in dieser Form:
Sub Text()
Dim strZeile
Open "Daten.txt" For Input As #1    Open "Datenneu.txt" For Output As #2
Do While Not EOF(1)
Line Input #1, strZeile
strZeile = Replace(strZeile, "alte Zahl", "neue Zahl")
Write #2, strZeile
Loop
Close #1    ' Datei schließen.
Close #2
End Sub
Ich weiß jetzt nicht genau, wie ich die Zahlen extrahiere - berechne - und zurückschreibe.
Viele Grüße
Ralf

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Textfile bearbeiten
08.11.2010 18:15:22
ransi
Hallo Ralf
Fzgmasse [t] 150.800
Reibmasse [t] 119.300
Haftreibungswert 1.000
Rhofzg (-) 4.540
Wirkgrad_konst 0.82000
Ist der Punkt ein Komma oder ein Tausendertrennzeichen ?
ransi
AW: Textfile bearbeiten
09.11.2010 08:20:35
Ralf_P
Hallo Ransi,
der Punkt ist ein Komma.
Gruß Ralf
AW: Textfile bearbeiten
09.11.2010 09:58:12
Ralf_P
Ok, ich versuche mein Problem noch mal anders zu beschreiben.
So stehen die Daten im Textfile:

Fzgmasse [t]         150.800
Reibmasse [t]        119.300
Haftreibungswert       1.000
RhoFzg (-)             4.540
Wirkgrad_konst         0.82000

Jetzt muß ich Zeile für Zeile auslesen, die Zahlenwerte extrahieren, per Berechnung verändern und dann exakt an die gleiche Stelle im Text zurück schreiben.
Wie man sieht, sind Datenbeschreibung und der entsprechende Wert nicht durch TAB getrennt, sondern durch verschiedene Anzahl Leerzeichen.
Nur das Komma (der Punkt) ist immer an der gleichen Position.
Irgendwie komme ich hier nicht auf den richtigen Weg.
Gruß Ralf
Anzeige
AW: Textfile bearbeiten
09.11.2010 10:51:36
Rudi
Hallo,
mal als Ansatz:
Sub ttt()
Dim sDaten, arrTmp, arrDaten(), i As Integer, iLen As Integer, vTmp
Open "c:\test\testb.txt" For Input As #1
sDaten = Split(Input(LOF(1), 1), vbCrLf)
Close #1
ReDim arrDaten(0 To UBound(sDaten))
For i = 0 To UBound(sDaten)
iLen = Len(sDaten(i))
arrTmp = Split(sDaten(i), Chr(32))
vTmp = arrTmp(UBound(arrTmp))
vTmp = Replace(vTmp, ".", ",")
'Neuberechnung
Select Case LCase(arrTmp(0))
Case "fzgmasse"
vTmp = vTmp * 5
Case "reibmasse"
vTmp=vTmp * 1.1
Case "haftreibungswert"
'nix
Case "rohfzg"
vTmp = vTmp - 8
Case "wirkgrad_konst"
'nix
End Select
vTmp = Format(vTmp, "0." & String(iLen - 25, "0"))
vTmp = Replace(vTmp, ",", ".")
arrDaten(i) = arrTmp(0) & " " _
& arrTmp(1) _
& String(iLen - Len(arrTmp(0)) - 1 - Len(arrTmp(1)) - Len(vTmp), " ") _
& vTmp
Next
'neue Datei schreiben
Open "c:\test\testb_neu.txt" For Output As #1
Print #1, Join(arrDaten, vbCrLf)
Close #1
End Sub

Gruß
Rudi
Anzeige
Ansatz ist gut
09.11.2010 11:40:53
Ralf_P
Hallo Rudi,
vielen Dank. Ich habe das gerade mal im Einzelschritt durchlaufen lassen und es funktioniert ganz gut.
Habe auch den Ansatz verstanden, aber da Du nicht das komplette Textfile kanntest, führt es natürlich zu Fehlern.
So sieht das ganze file aus:

#229 Sitzplätze; weitere Fahrzeugbeschreibung
#6,8 t Zuladung, entspricht ca. 90 P. mit 75 kg bzw. 40%
#Herstellercode-Code W66
Vmax [km/h]          160.000
Loklaenge [m]         74.300
Fzgmasse [t]         150.800
Reibmasse [t]        119.300
Haftreibungswert       1.000
RhoFzg (-)             4.540
Wirkgrad_konst         0.82000
LeistungHilfsbr        0.00000
LeistungHeizung        0.00000
Rutkommentar        W66
Stromabnehmer       0
zmaxi                      0.0
imaxi                      0.0
zknick                     0.0
iknick                     0.0
znull                      0.0
inull                      0.0
zzwei                      0.0
izwei                      0.0
Dauerstrom                 0.0
Zeitkonstante              0.0
Vorerwärmung               0.0
ST      ge     0.000 190.000   55.000 190.000    0.000   0.000
ST      ge    55.000 190.000   60.000 174.000    0.000   0.000
ST      ge    60.000 174.000   70.000 149.000    0.000   0.000
ST      ge    70.000 149.000   80.000 131.000    0.000   0.000
ST      ge    80.000 131.000   90.000 116.000    0.000   0.000
ST      ge    90.000 116.000  100.000 104.000    0.000   0.000
ST      ge   100.000 104.000  110.000  95.000    0.000   0.000
ST      ge   110.000  95.000  113.000  93.000    0.000   0.000
ST      ge   113.000  93.000  120.000  82.000    0.000   0.000
ST      ge   120.000  82.000  130.000  70.000    0.000   0.000
ST      ge   130.000  70.000  140.000  60.000    0.000   0.000
ST      ge   140.000  60.000  150.000  52.000    0.000   0.000
ST      ge   150.000  52.000  160.000  46.000    0.000   0.000
BV      ge     0.000   0.000    8.000   0.000    0.000   0.000
BV      ge     8.000   0.000   10.000 100.000    0.000   0.000
BV      ge    10.000 100.000  118.000 100.000    0.000   0.000
BV      ge   118.000 100.000  120.000  96.000    0.000   0.000
BV      ge   120.000  96.000  130.000  83.000    0.000   0.000
BV      ge   130.000  83.000  140.000  72.000    0.000   0.000
BV      ge   140.000  72.000  150.000  62.000    0.000   0.000
BV      ge   150.000  62.000  160.000  54.000    0.000   0.000
LW  vplus15        1479.000000       3.620000       0.440000       0.000000       0.000000
Rueckspeisen         0
DecParametersatzA       0.000000000    0.000000000    0.000000000    0.000000000    0.000000000
DecParametersatzB       0.000000000    0.000000000    0.000000000    0.000000000
Grundlast                     0.000
end

Verändert (Berechnet) werden nur die Werte in Zeile 6, 7 und 8.
Daher war
Case "fzgmasse"
vTmp = vTmp * 5
Case "reibmasse"
vTmp = vTmp * 1.1
Case "haftreibungswert"
'nix
Case "rohfzg"
vTmp = vTmp - 8
genau richtig.
Die Berechnung dieser 3 Werte ist abhängig von den Sitzplätzen in Zeile 1 und deren Besetzungsgrad
viele Grüße
Ralf
Anzeige
Ansatz besser
09.11.2010 12:08:12
Rudi
Hallo,
Sub ralf_p()
Dim sDaten, arrTmp, arrDaten(), i As Integer, iLen As Integer, vTmp
Dim iAnzahlSitzPlaetze
Open "c:\test\ralf_p.txt" For Input As #1
sDaten = Split(Input(LOF(1), 1), vbCrLf)
Close #1
ReDim arrDaten(0 To UBound(sDaten))
For i = 0 To UBound(sDaten)
iLen = Len(sDaten(i))
If i = 0 Then
iAnzahlSitzPlaetze = Mid(sDaten(i), 2, 3)
End If
arrTmp = Split(sDaten(i), Chr(32))
'Neuberechnung
Select Case LCase(arrTmp(0))
Case "fzgmasse", "reibmasse", "rohfzg"
vTmp = arrTmp(UBound(arrTmp))
vTmp = Replace(vTmp, ".", ",")
Select Case LCase(arrTmp(0))
Case "fzgmasse"
vTmp = vTmp + iAnzahlSitzPlaetze * 0.075
Case "reibmasse"
vTmp = vTmp * 1.1
Case "rohfzg"
vTmp = vTmp - 8
End Select
vTmp = Format(vTmp, "0." & String(iLen - 25, "0"))
vTmp = Replace(vTmp, ",", ".")
arrDaten(i) = arrTmp(0) & " " _
& arrTmp(1) _
& String(iLen - Len(arrTmp(0)) - 1 - Len(arrTmp(1)) - Len(vTmp), " ") _
& vTmp
Case Else: arrDaten(i) = sDaten(i)
End Select
Next
'neue Datei schreiben
Open "c:\test\ralf_p_neu.txt" For Output As #1
Print #1, Join(arrDaten, vbCrLf)
Close #1
End Sub

Gruß
Rudi
Anzeige
AW: Ansatz besser
09.11.2010 12:36:59
Ralf_P
Hallo Rudi,
also wirklich vielen Dank für Deine Unterstützung - ist ja nicht selbstverständlich.
Hier bleibts hängen:

'Neuberechnung
Select Case LCase(arrTmp(0)) '

Habe mal
Select Case LCase(arrTmp(0)) durch
Select Case LCase(arrTmp(i)) ersetzt, aber auch bleibts hängen.
Viele Grüße
Ralf
AW: Ansatz besser
09.11.2010 12:51:12
Rudi
Hallo,
kann ich nicht nachvollziehen. Mit dem von die eingestellten Text geht es.
Gruß
Rudi
evtl. Leerzeile
09.11.2010 12:57:49
Rudi
Hallo,
falls Leerzeilen im Text sind, kommt der Fehler. Evtl auch ein einsames Return am Ende des Textes.
Sub ralf_p()
Dim sDaten, arrTmp, arrDaten(), i As Integer, iLen As Integer, vTmp
Dim iAnzahlSitzPlaetze
Open "c:\test\ralf_px.txt" For Input As #1
sDaten = Split(Input(LOF(1), 1), vbCrLf)
Close #1
ReDim arrDaten(0 To UBound(sDaten))
For i = 0 To UBound(sDaten)
If i = 0 Then
iAnzahlSitzPlaetze = Mid(sDaten(i), 2, 3)
End If
If arrDaten(i)  "" Then
arrTmp = Split(sDaten(i), Chr(32))
'Neuberechnung
Select Case LCase(arrTmp(0))
Case "fzgmasse", "reibmasse", "rohfzg"
iLen = Len(sDaten(i))
vTmp = arrTmp(UBound(arrTmp))
vTmp = Replace(vTmp, ".", ",")
Select Case LCase(arrTmp(0))
Case "fzgmasse"
vTmp = vTmp + iAnzahlSitzPlaetze * 0.075
Case "reibmasse"
vTmp = vTmp * 1.1
Case "rohfzg"
vTmp = vTmp - 8
End Select
vTmp = Format(vTmp, "0." & String(iLen - 25, "0"))
vTmp = Replace(vTmp, ",", ".")
arrDaten(i) = arrTmp(0) & " " _
& arrTmp(1) _
& String(iLen - Len(arrTmp(0)) - 1 - Len(arrTmp(1)) - Len(vTmp), " ") _
& vTmp
Case Else: arrDaten(i) = sDaten(i)
End Select
Else
arrDaten(i) = sDaten(i)
End If
Next
'neue Datei schreiben
Open "c:\test\ralf_p_neu.txt" For Output As #1
Print #1, Join(arrDaten, vbCrLf)
Close #1
End Sub

Gruß
Rudi
Anzeige
AW: evtl. Leerzeile
09.11.2010 13:54:51
Ralf_P
Hallo Rudi,
ich verstehe nicht, wie es bei Dir funktionieren konnte?
Ich habe an dieser Stelle

ReDim arrDaten(0 To UBound(sDaten))
For i = 0 To UBound(sDaten)
arrDaten(i) = sDaten(i)         '

nochmal den Codeschnipsel zum Füllen des Arrays eingefügt - nun geht es.
Vorher hat der Code die innere Schleife zur Neuberechnung garnicht durchlaufen, weil

If arrDaten(i)  "" Then

niemals erfüllt war - das Array war ja leer.
Trotzdem hast Du mir wieder einmal wahnsinnig geholfen, aber auch zu erneuten Depressionen verholfen - es gibt noch so viel was ich nicht kann ;-)
Danke und Gruß
Ralf
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige