Text aus Datei lesen, bearbeiten und in neue .txt Datei spechern

shisho1980

Grünschnabel
Guten Tag,

Ich habe schon einige Beiträge zum Thema gelesen, doch habe ich folgendes Problem dabei nicht lösen können.

Ausgangslage: unter dem Pfad C\temp\interfac\ befindet sich eine via unbekannte Software erstellte Datei BAL001R7.089 (7 für Jahr 2007 und .089 = Tag des Jahres) mit Daten aus AS400 welche schrecklich formatiert sind. Mein Ziel ist, diese Daten in einer neuen Datei abzulegen, dabei müssen einzelne Zeichenketten gekürzt und andere gar nicht berücksichtigt werden, zudem muss nur immer die letzte Zeile in der Datei berücksichtigt werden. So sieht z.B. die letzte Zeile der Datei im Ursprung aus, wenn ich sie im Editior öffne:

DTA SRCSRV 0897BAL00100001A070330104117CHIBM000YBATH010CHIBM000CHTCS00100000000YBATH010A IN03554 4729010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000108639530 D CH BS M 90 INGOLD Nathanael Oesliweg 0008 441000LIESTAL 0 CH 08006251 01001

Am Ende hätte ich gerne nur die Fett markierten Daten in einer neuen Datei (mit Tabstop getrennt abgespeichert. Könnte mir jemand helfen?

Die Daten aus der Datei einlesen ist ja nicht der schwierige Teil, aber die einzelnen Daten extrahieren hingegen schon. :confused:

Die Zeilen sind in der Regel immer gleich aufgebaut sein.

Vielen Dank bereits jetzt für die Unterstützung.
 
Hallo,

erstmal ein Hinweis:
Wenn Du beim Erstellen eines Themas dieses auch gleich als erledigt markierst, kann es sein, dass sich niemand Deiner annimmt :)

Zum Problem:
Wenn die Dateien - so wie Du sagst - immer gleich aufgebaut sind, dann zerlege die Zeichenkette doch mit den String-Funktionen Right(), Left(), Mid()

Gruß
 
danke erstmal für den wichtigen Hinweis :eek: da hab ich mich wohl ein bisschen verklickt.

Das Problem (denke ich als Laie zumindest) mit der String-Funktion ist, dass meine Zeile nur bis zum folgenden Abschnitt IMMER gleich ist:

DTA SRCSRV 0897BAL00100001A070330104117CHIBM000YBATH010CHIBM000CHTCS00100000000YBATH010A IN03554 4729010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000108639530

Danach varieren die Teil-Zeichenketten die ich mit der String-Funktion auslesen könnte natürlich in der Länge, je nach dem welcher Name, bzw. Nachname und Adresse ect. der Kontakt hat. Somit kann ich ja nicht mit fixen Abgrenzungen arbeiten. Gibt es allenfalls eine Möglichkeit die durch Tabstop getrennten Zeichenketten in verschiedene Strings zu lesen und diese danach einzeln mit dem Right() Left() ect. zu bearbeiten?

Also was ich mir vorstelle wäre quasi
string1 DAT
string2 SRCSRV
string3 0897BAL00100001A070330104117CHIBM000YBATH010CHIBM000CHTCS00100000000YBATH010A

ect.

Ich bin absoluter VB Neuling und konnte gerade mal den Pfadnamen generieren und die Datei einlesen, aber wie ich jetzt die einzelnen Daten herausfiltern kann weiss ich nicht!

Was ich bis jetzt hab ist folgenes:
Code:
Private Sub Form_Load()
Tag$ = DatePart("y", Now)
Erw$ = 0
Jahrunform$ = DatePart("yyyy", Now)
Jahr$ = Right$(Jahrunform$, 1)
Path$ = "C:\temp\interfac\BAL001R" & Jahr$ & "." & Erw$ & Tag$
Text1.Text = Path$

Dim FNr As Integer
Dim s As String
Dim sFile As String

sFile = Path$
FNr = FreeFile

Open sFile For Input As #FNr
While (Not (EOF(FNr)))
Line Input #FNr, s
Wend

Text2.Text = s
End Sub
 
...Gibt es allenfalls eine Möglichkeit die durch Tabstop getrennten Zeichenketten in verschiedene Strings zu lesen und diese danach einzeln mit dem Right() Left() ect. zu bearbeiten?

Ja, gibt es. Mit der Split()-Funktion kannst Du Dir den String in ein array schreiben lassen und dann die einzelnen Einträge verabeiten. Hab' Dir mal ein Beispiel in Deinen Code eingebaut:
Visual Basic:
Open sFile For Input As #FNr
    While (Not (EOF(FNr)))
        Line Input #FNr, s
    Wend
Close FNr

Dim myArray() As String
myArray = Split(s, Chr(32))


Gruß
 
So, danke erstmal für dein Posting, jetzt hab ich meinen Code entsprechend erweitert und den Array zum Testen in eine Listbox geholt, leider entstehen da im Array lauter leere Zeilen zwischen den anzuzeigenden Daten, hast du eine Idee wieso dem so ist?

Code:
Open sFile For Input As #FNr
While (Not (EOF(FNr)))
Line Input #FNr, s
Wend
Close FNr

Dim myArray() As String
myArray = Split(s, Chr(32))

For x% = LBound(myArray$) To UBound(myArray$)
List1.AddItem (myArray$(x%))
Next x%

Zudem hab ich nirgens ein schlaues Posting gefunden welches mir beschreibt wie ich mit dem Array anschliessend umgehen muss um die einzelnen Einträge im Array separat bearbeiten zu können. Ich möchte ja anschliessend bsp:

3ter Eintrag im Array um 15 Stellen verkürzen, was ich dann mit dem Right() bzw. Left() machen könnte!

Wie kann ich also beliebige Position im Array einem String zuweisen um es anschliessen bearbeiten zu können?

Danke für Inputs und entschuldige meine Unwissenheit :)
 
Hi,

Wenn in dieser Datei bestimmte Strings auftreten, kannst du es z.B. so probieren:

PHP:
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set datei = fso.OpenTextFile(deine_Datei)
Text = datei.ReadAll 
Pos1 = InStr( 1,Text,"Nathanel..",1)
If Pos1 > 0 Then
  If InStr(1,Text, "Nathanel..",1) > 0 Then

Wenn dieser Abschnitt gefunden wurde, kannst du mithilfe der Funktionen "Left", bzw. "Right" deinen Text finden und anschließend wieder in eine neue Datei einschreiben

PHP:
Set objFile = FSO.CreateTextFile("C:\...\...\FormatierterText.txt")

objFile.Writeline Right(Text...) 
//mit eben so vielen nqachkommastellen wies is, bzw. notfalls nimmst du die komplette //restliche zeile und filterst anschleießnd noch einmal

Hoffe, das könnte dir etwas helfen
 
im Array einen String zuweisen,

kennst du diese beliebige Stelle?! ;-)

ich denke mal durch

arrString(i) = String

Array "arrString" mit dem iten Element weist du dein String zu, das i kannst du ja bspw. ersetzten durch eine freste zahl, oder habe ich was falsch verstanden?!
 
Danke erstmal,

ich denke aber das deine Lösung nicht zu dem Ziel kommt das ich eigentlich beabsichtige:

In meiner Urspungsdatei befindet sich (komisch formierter) Text :) welchen ich, weil ich es schlussendlich entweder an Access oder PHP übergeben will "schön" formatieren will. Aus dem Zahlen & Buchstabenwirrwar will ich wie weiter oben beschrieben nur die Fett gedruckten Daten rauspicken und zuerst in Textfeldern auf einem VBA Formular anzeigen lassen damit ich Sie dort bei Bedarf noch ändern könnte und anschliessend in eine neue Textdatei mit z.B. Tab oder x-beliebigem Trennzeichen speichern.

Am Anfang sieht das ganze so aus:
DTA SRCSRV 0897BAL00100001A070330104117CHIBM000YBATH010CHIBM000CHTCS00100000000YBATH010A IN03554 4729010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000108639530 D CH BS M 90 INGOLD Nathanael Oesliweg 0008 441000LIESTAL 0 CH 08006251 01001

und am ende hätte ich gerne eine Datei die so aus sieht:
YBATH010;IN03554;00108639530;D;CH;M;INGOLD;Nathanael;Oesliweg;008;4410;Liestal;01001

Die Idee war also das ganze in einen Array zu holen, um somit die einzelnen Zeichenketten zu bearbeiten bzw. zu kürzen damit ich am Ende nur die benötigten Daten in der neuen Datei speichern kann.

Da ich nicht grosse Ahnung von VB hab, dachte ich mir, ich könnte die einzelnen Einträge im Array irgendwie zum Bearbeiten aufrufen!
 
...jetzt hab ich meinen Code entsprechend erweitert und den Array zum Testen in eine Listbox geholt, leider entstehen da im Array lauter leere Zeilen zwischen den anzuzeigenden Daten, hast du eine Idee wieso dem so ist?
Nein, weiss ich nicht. Bei mir enstehen da keine leeren Zeilen...

Und wo genau liegt jetzt noch das Problem mit den Strings im Array?! Du liest es doch schon aus, wenn Du die einzelnen Einträge in die ListBox schreibst:
Visual Basic:
For x% = LBound(myArray$) To UBound(myArray$)
    List1.AddItem (myArray$(x%))
Next x%

Statt die einzelnen Einträge nun in die Liste zu schreiben, kannst Du die Strings doch z.B. in eine Bearbeitungsmethode schicken und dann den überarbeiteten String wieder ins Array schreiben. In etwa sowas:
Visual Basic:
Sub readTxtFile()
   ...
   For x% = LBound(myArray$) To UBound(myArray$)
      myArray$(x%) = editString(myArray$(x))
   Next x% 
   ...
End Sub

Function editString (strToEdit as String) as String
   'strToEdit bearbeiten...
   editString = strToEdit
End Sub
 
Zurück