Supportnet Computer
Planet of Tech

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

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

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?

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

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

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.

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 ;-)

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?

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.

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

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:


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 Function


Der 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 Sub


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()

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

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.

Antwort 17 von laurel99

OK, Dank euch beiden für die Bemühungen, Ich werd mich mal ransetzen...
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ß

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:

Public Sub Read_File(FileName As String)


Der Aufruf erfolgt dementsprechend (Beispiel):

Read_File Me.txtDateiName


Antwort 20 von laurel99

Vielen Dank!

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: