Supportnet / Forum / Datenbanken
Textfile String separieren
Frage
Hallo zusammmen,
ich bekomme aus einem Textfile Daten zugesandt. Ich kann diese auch super verarbeiten, nur gibt es ein Prob:
Alle Daten stehen jeweils in einer Zeile, das ist ja OK, aber in einer Zeile steh die Daten in der Form " X/Y".
Ich benötige X und Y seperat.
Also meine Frage, kann ich ich diese irgendwie splitten, um jedes für sich zu greifen?
Ja klar, per Hand kein Problem, aber bei hunderten von Textfiles eine mühselige arbeit, und ich dachte das irgendwie per Code (VBA) zu lösen.
Das String anhand des "/"- Zeichens aufzuspüren keine Chance, da an einer anderen Stelle es ebenfalls vorkommt.
Hoffe auf eure Hilfe
Dank
laurel99
Antwort 1 von disco
moin
ohne seperator wirste da nicht weit kommen, ausser die werte haben immer die gleiche länge.
was bedeutet, dass alle daten jeweils in einer zeile stehen? dass es nur eine zeile gibt? oder, dass jeder zusammenhängende datensat in einer zeile steht?
verstehe nicht wozu das / dann drinn ist, wenn es nicht als seperator genutzt werden kann? kann man den nicht abzählen, wenn der öfter in einer zeile vorkommt. oder kommt er auch in den nutztdaten vor?
g,
disco
ohne seperator wirste da nicht weit kommen, ausser die werte haben immer die gleiche länge.
was bedeutet, dass alle daten jeweils in einer zeile stehen? dass es nur eine zeile gibt? oder, dass jeder zusammenhängende datensat in einer zeile steht?
verstehe nicht wozu das / dann drinn ist, wenn es nicht als seperator genutzt werden kann? kann man den nicht abzählen, wenn der öfter in einer zeile vorkommt. oder kommt er auch in den nutztdaten vor?
g,
disco
Antwort 2 von laurel99
Danke für die rasche Antwort!
also in jeder Zeile bedeutet, dass in jeder Zeile des Textfiles ein Wert steht den ich benötige
wert
wert
wert
wert
...
wert
und mittendrin (leider) in der Art
wert
wert/wert
...
Mit " / " kann ich so nichts Anfangen, da er auch schon bei einer anderen Bezeichnung im Textfeld, als Teil eines strings mit drin steht. Daran kann ich auch leider nichts ändern, da ich ja die files auch nur bekomme.
Gruß
laurel99
also in jeder Zeile bedeutet, dass in jeder Zeile des Textfiles ein Wert steht den ich benötige
wert
wert
wert
wert
...
wert
und mittendrin (leider) in der Art
wert
wert/wert
...
Mit " / " kann ich so nichts Anfangen, da er auch schon bei einer anderen Bezeichnung im Textfeld, als Teil eines strings mit drin steht. Daran kann ich auch leider nichts ändern, da ich ja die files auch nur bekomme.
Gruß
laurel99
Antwort 3 von nostalgiker6
Der Textfile-Erzeuger gehört ausgepeitscht, wenn er ein und dasselbe Zeichen mal als Textbestandteil, mal als Trennzeichen verwendet.
Aber das würde natürlich das Problem nicht lösen.
Verstehe ich das richtig, dass der Textfile mehrere Spalten hat, von denen EINE die benötigten Daten (einen oder manchmal zwei Werte) enthält?
Aber das würde natürlich das Problem nicht lösen.
Verstehe ich das richtig, dass der Textfile mehrere Spalten hat, von denen EINE die benötigten Daten (einen oder manchmal zwei Werte) enthält?
Antwort 4 von nostalgiker6
Wenn ja - um wieviele Spalten handelt es sich, und werden die anderen Spalten tatsächlich alle NICHT benötigt?
Antwort 5 von Teddy7
Hilft es vielleicht das zweite Auftreten von / in einer Zeile festzustellen ?
Antwort 6 von laurel99
@Teddy7
Wär ne Möglichkeit, aber in der anderen Zeile wo ich dies "/" in einer Bezeichnung zu stehen habe, kommt es nicht immer vor.
@nostalgiker6
Nicht das wir uns falsch verstehen. NICHT Spalten sondern Zeilen.
Das Textfile wird automatisch erzeugt (Maschine)
und dort wo das "/" stehen bleiben soll handelt es sich um eine Bezeichnung
Also Zeilen hat das File 259
und immer in der 8. Zeile Steht der Wert(e) die ich benötige
Dank und Gruß
laurel99
Wär ne Möglichkeit, aber in der anderen Zeile wo ich dies "/" in einer Bezeichnung zu stehen habe, kommt es nicht immer vor.
@nostalgiker6
Nicht das wir uns falsch verstehen. NICHT Spalten sondern Zeilen.
Das Textfile wird automatisch erzeugt (Maschine)
und dort wo das "/" stehen bleiben soll handelt es sich um eine Bezeichnung
Also Zeilen hat das File 259
und immer in der 8. Zeile Steht der Wert(e) die ich benötige
Dank und Gruß
laurel99
Antwort 7 von Teddy7
steht denn in der 8. Zeile nur der Wert, den Du brauchst ?
Dann mußt Du doch nur beim zeilenweise einlesen einen Zähler mitlaufen zu lassen.
Gruß
Teddy
Dann mußt Du doch nur beim zeilenweise einlesen einen Zähler mitlaufen zu lassen.
Gruß
Teddy
Antwort 8 von erik
Und woran erkennst du, dass es sich um eine Bezeichnung handelt? Handelt es sich dabei immer nur um reinen Text? Befinden sich in den anderen Zeilen dagegen nur Zahlen?
Wenn du die Textdatei liest, dann musst du zwangsweise gewisse Regeln im Kopf bilden, mit denen du die Daten entsprechend zerpflückst. Über diesen Regelsatz musst du dir erstmal im Klaren sein, bevor man überhaupt an die Programmierung denken kann. Beispielsweise könnten solche Bezeichnungen frühestens in der zehnten Zeile auftauchen oder umgekehrt. Oder sie stehen immer in derselben Zeilennummer usw.
Das Zerpflücken solcher Textdateien ist immer eine sehr individuelle Angelegenheit. Ohne genauere Kenntnis der tatsächlichen Inhalte wird es schwer werden, dir zu helfen. Für die Helfer hier würde das dann eher zu eine Ratespiel ausarten.
Wenn du die Textdatei liest, dann musst du zwangsweise gewisse Regeln im Kopf bilden, mit denen du die Daten entsprechend zerpflückst. Über diesen Regelsatz musst du dir erstmal im Klaren sein, bevor man überhaupt an die Programmierung denken kann. Beispielsweise könnten solche Bezeichnungen frühestens in der zehnten Zeile auftauchen oder umgekehrt. Oder sie stehen immer in derselben Zeilennummer usw.
Das Zerpflücken solcher Textdateien ist immer eine sehr individuelle Angelegenheit. Ohne genauere Kenntnis der tatsächlichen Inhalte wird es schwer werden, dir zu helfen. Für die Helfer hier würde das dann eher zu eine Ratespiel ausarten.
Antwort 9 von laurel99
Hallo und Morgen alle zusammen,
also im Prinzip brauche ich fast alle Werte die im Textfile vorkommen. Es ist eine Mischhung aus Strings und Zahlen.
Wie gesagt, ich weiß über das vorkommen, also über den Aufbau bescheid, der sich in allen Files gleicht.
Mal ein Beispiel, ich gebe es so an wie es im file vorkommt (rein erfunden, richtet sich aber nach dem Aufbau. In Klammern ist nur Erklärung):
Niederzissen (Bezeichnung: string)
BHML/267MK (Bezeichnug: string)
892457342 (Zahl)
250.1 (Wert: Zahl)
16.0 (Wert Zahl)
10.03.2006 (Datum)
Michel/Pelk (Namen)
23/26 (Temperaturen, beide benötigt)
--
53 (Wert: Zahl)
...
usw.
ab hier kommen eigentlich nur n och Werte, aber ich denke dass dürfte den Aufbau erklären.
Ich danke euch ;-)
also im Prinzip brauche ich fast alle Werte die im Textfile vorkommen. Es ist eine Mischhung aus Strings und Zahlen.
Wie gesagt, ich weiß über das vorkommen, also über den Aufbau bescheid, der sich in allen Files gleicht.
Mal ein Beispiel, ich gebe es so an wie es im file vorkommt (rein erfunden, richtet sich aber nach dem Aufbau. In Klammern ist nur Erklärung):
Niederzissen (Bezeichnung: string)
BHML/267MK (Bezeichnug: string)
892457342 (Zahl)
250.1 (Wert: Zahl)
16.0 (Wert Zahl)
10.03.2006 (Datum)
Michel/Pelk (Namen)
23/26 (Temperaturen, beide benötigt)
--
53 (Wert: Zahl)
...
usw.
ab hier kommen eigentlich nur n och Werte, aber ich denke dass dürfte den Aufbau erklären.
Ich danke euch ;-)
Antwort 10 von erik
So sieht die Sache schon etwas besser aus. :-)
Kann man demnach folgende Behauptungen aufstellen:
1. Wenn in einer Zeile ein Schrägstrich enthalten ist und die restlichen Zeichen nur Zahlen sind, dann sind es Temperaturen.
2. Wenn in einer Zeile ein Schrägstrich enthalten ist und in der restlichen Zeichenfolge ist mindestens ein Zeichen, was keine Zahl ist, dann ist es eine Bezeichnung.
Kannst du das bestätigen, dann ist das kein Problem.
Was mich aber noch interessieren würde, können bestimmte Daten, wie z.B. die Temperatur nicht immer in der gleichen Zeile gefunden werden? In deinem Beispiel wäre es Zeile Nummer 8. Oder beginnt eine Datei zumindest mit einer fest definierten Datenstruktur? Da muss doch irgendwo ein Muster erkennbar sein.
Wie groß sind eigentlich solche Dateien in KB?
Kann man demnach folgende Behauptungen aufstellen:
1. Wenn in einer Zeile ein Schrägstrich enthalten ist und die restlichen Zeichen nur Zahlen sind, dann sind es Temperaturen.
2. Wenn in einer Zeile ein Schrägstrich enthalten ist und in der restlichen Zeichenfolge ist mindestens ein Zeichen, was keine Zahl ist, dann ist es eine Bezeichnung.
Kannst du das bestätigen, dann ist das kein Problem.
Was mich aber noch interessieren würde, können bestimmte Daten, wie z.B. die Temperatur nicht immer in der gleichen Zeile gefunden werden? In deinem Beispiel wäre es Zeile Nummer 8. Oder beginnt eine Datei zumindest mit einer fest definierten Datenstruktur? Da muss doch irgendwo ein Muster erkennbar sein.
Wie groß sind eigentlich solche Dateien in KB?
Antwort 11 von erik
Ich lese gerade nachträglich in Antwort 9, dass der Dateianfang immer gleich ist? Dann gäbe es ja noch weniger Probleme. Jede Zeile könnte dann eindeutig einem Informationstyp zugeordnet werden.
Antwort 12 von nostalgiker6
Ich würde die Doppel-Daten mit einem sehr simplen Programm (z.B. in QuickBasic, geht aber sicher auch mit VBA) trennen und in eine eigene Zeile schreiben. Die Ausgabedatei hat dann eine Zeile je "Datensatz" mehr.
Oder alle Zeilen eines Datensatzes als Felder einer einzigen Zeile schreiben und dabei natürlich die Doppeldaten in zwei Felder aufteilen.
Oder alle Zeilen eines Datensatzes als Felder einer einzigen Zeile schreiben und dabei natürlich die Doppeldaten in zwei Felder aufteilen.
Antwort 13 von laurel99
@ erik
zu 1: korrekt
zu 2: leider ist dem nicht immer so, es kann auch vorkommen, dass es nur Zahlen sind. Kann aber auch beides vorkommen.
Dateigröße 2kB
wie gesagt Struktur immer gleich.
@nostalgiker6
hast du eine Ahnung, wie das in VB aussehen könnte.
Dank erstmal euch beiden
zu 1: korrekt
zu 2: leider ist dem nicht immer so, es kann auch vorkommen, dass es nur Zahlen sind. Kann aber auch beides vorkommen.
Dateigröße 2kB
wie gesagt Struktur immer gleich.
@nostalgiker6
hast du eine Ahnung, wie das in VB aussehen könnte.
Dank erstmal euch beiden
Antwort 14 von erik
Unter den gegebenen Umständen lässt sich das relativ leicht erledigen.
Ich würde die ganze Textdatei einladen und die Zeilen zerlegt in einem Array speichern. Über die Zeilennummern der Textdatei (um 1 reduziert) kannst du dann bequem auf die Zeilen zugreifen. Die folgende Funktion erledigt das:
Der Zugriff auf die Daten könnte so aussehen:
Bei arr(7) (-> Temperaturen) müssen die einzelnen Teile von Funktionen zurückgegeben werden. Der Einfachheit halber nehme ich zwei Funktionen namens TempLinks() und TempRechts()
Auf die Temperaturen greifst du dann wie folgt zu:
Ich würde die ganze Textdatei einladen und die Zeilen zerlegt in einem Array speichern. Über die Zeilennummern der Textdatei (um 1 reduziert) kannst du dann bequem auf die Zeilen zugreifen. Die folgende Funktion erledigt das:
Public Function ReadFile(FileName As String) As Variant
Dim intFileNum As Integer
Dim strData As String
intFileNum = FreeFile()
Open FileName For Input Access Read As #intFileNum
strData = Input(LOF(intFileNum), #intFileNum)
Close #intFileNum
ReadFile = Split(strData, vbCrLf)
End FunctionDer Zugriff auf die Daten könnte so aussehen:
Public Sub Test
Dim arr As Variant
arr = ReadFile("<Dateiname>")
Msgbox "Zeile 1: " & arr(0)
MsgBox "Zeile 2: " & arr(1)
MsgBox "Zeile 3: " & arr(2)
´usw....
End SubBei arr(7) (-> Temperaturen) müssen die einzelnen Teile von Funktionen zurückgegeben werden. Der Einfachheit halber nehme ich zwei Funktionen namens TempLinks() und TempRechts()
Public Function TempLinks(varZeile As Variant) As Variant
If IsNull(varZeile) Then
TempLinks=Null
ElseIf InStr(varZeile, "/") > 0 Then
TempLinks=Left(varZeile, Instr(varZeile,"/")-1)
Else
TempLinks=varZeile
End If
End Function
Public Function TempRechts(varZeile As Variant) as Variant
If IsNull(varZeile) Then
TempRechts=Null
ElseIf Instr(varZeile,"/") > 0 Then
TempRechts=Mid(varZeile, Instr(varzeile,"/")+1)
Else
´Bei einem einzelnen Wert nichts zurückgeben,
´das ist nur TempLinks vorbehalten
TempRechts=Null
End If
End Function
Auf die Temperaturen greifst du dann wie folgt zu:
Msgbox "Temperatur links: " & TempLinks(arr(7))
Msgbox "Temperatur rechts: " & TempRechts(arr(7))
Antwort 15 von nostalgiker6
Im guten alten QuickBasic (kann man sich noch herunterladen!) könnte die Trennung der Zeile mit den Doppelwerten zwei Zeien z.B. so aussehen:
CLS
INPUT "Dateiname (mit Pfad): ", datei$
Ausgabe$ = datei$
MID$(Ausgabe$, 4, 1) = "N"
OPEN datei$ FOR INPUT AS 1
OPEN Ausgabe$ FOR OUTPUT AS 2
WHILE NOT EOF(1)
i% = i% + 1
INPUT #1, Zeile$
IF i% = 8 THEN
i% = 0
Var1% = VAL(Zeile$)
Strt% = LEN(MID$(STR$(Var1%), 2, 99)) + 1
Var2% = VAL(MID$(Zeile$, Strt%, 10))
WRITE #2, Var1%, Var2%
ELSE
WRITE #2, Zeile$
END IF
WEND
CLS
INPUT "Dateiname (mit Pfad): ", datei$
Ausgabe$ = datei$
MID$(Ausgabe$, 4, 1) = "N"
OPEN datei$ FOR INPUT AS 1
OPEN Ausgabe$ FOR OUTPUT AS 2
WHILE NOT EOF(1)
i% = i% + 1
INPUT #1, Zeile$
IF i% = 8 THEN
i% = 0
Var1% = VAL(Zeile$)
Strt% = LEN(MID$(STR$(Var1%), 2, 99)) + 1
Var2% = VAL(MID$(Zeile$, Strt%, 10))
WRITE #2, Var1%, Var2%
ELSE
WRITE #2, Zeile$
END IF
WEND
Antwort 16 von nostalgiker6
Sorry - so wird der 2. Wert nicht in eine Extra-Zeile geschrieben, sondern kommasepariert in ein Extra-Feld. Aber die Änderung, damit stattdessen eine zusätzliche Zeile entsteht, ist offensichtlich.
Ausserdem sollte die Ausgabedatei besser ebenfalls per inout abgefragt werden.
Ausserdem sollte die Ausgabedatei besser ebenfalls per inout abgefragt werden.
Antwort 17 von laurel99
OK, Dank euch beiden für die Bemühungen, Ich werd mich mal ransetzen...
Gruß
laurel99
Gruß
laurel99
Antwort 18 von laurel99
hall nochmal,
hab mich in erik´s Lösung eingearbeitet. Versteh ich auch. Ich komm jetzt nur nicht mit den Aufrufen klar.
Bis Jetzt hatte ich eine Form (VBA) von der aus ich mit
call read_File
das einlesen aufgerufen (in einem Modul) habe
public sub read_File()
...
In Ihr hatte ich schon ein array, dass das Textfile einliest
Nun habe ich versucht diese in die functoin von oben zu ändern, weiß aber nicht wie ich sie aufrufen kann.
Gruß
hab mich in erik´s Lösung eingearbeitet. Versteh ich auch. Ich komm jetzt nur nicht mit den Aufrufen klar.
Bis Jetzt hatte ich eine Form (VBA) von der aus ich mit
call read_File
das einlesen aufgerufen (in einem Modul) habe
public sub read_File()
...
In Ihr hatte ich schon ein array, dass das Textfile einliest
Nun habe ich versucht diese in die functoin von oben zu ändern, weiß aber nicht wie ich sie aufrufen kann.
Gruß
Antwort 19 von erik
Der Aufruf ist in Antwort 14 in der Beispielprozedur "Test" dokumentiert. Du musst nur die Platzhalterzeichenfolge "<Dateiname>" durch eine Variable oder Textfeld ersetzen, die/das den tatsächlichen Dateinamen enthält. Hast du den Code in ein Modul kopiert, dann muss der Dateiname als Parameter an die Prozedur übergeben werden:
Der Aufruf erfolgt dementsprechend (Beispiel):
Public Sub Read_File(FileName As String)Der Aufruf erfolgt dementsprechend (Beispiel):
Read_File Me.txtDateiNameAntwort 20 von laurel99
Vielen Dank!

