Seite 1 von 1

Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 10:50
von ahartwig
Hallo zusammen,
ich bin Neuling was OpenOffice Base angeht. Ich möchte eine Hostdatei parsen, und in einer Base Tabelle ablegen. Die Datei besteht aus einer langen Zeichenkette (ca. 400.000 Zeichen), die aus Datensätzen zu je 30 Zeichen besteht. Es gibt keinen Datensatztrenner, sondern die Datensätze sind über ihre Länge definiert.
Aufgrund der Länge kann ich sie nicht in einen String laden und dann via Stringfunktionen, die Datensätze exstrahieren.
Als zweiten Schritt müßten die Daten, die in Base manipuliert werden, wieder in eine Datei mit dem selben Format geschrieben werden.
Kann mir jemand erklären, wie das funktionieren könnte.
Danke schon mal in Vorraus.

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 11:32
von komma4
Ich würde die Hostdatei erstmal mit einem CSV-Programm bearbeiten und in 30-Zeichen lange Einzelsätze (carriage return und/oder nur linefeed am Ende) zerlegen. Unter Windows bietet sich hier das Freeware-Tool CSVed an.
Diese Datei kannst Du als Datenquelle (Typ: txt) mit einer BASE-Datei nutzen.

Zum Export kommen wir dann, wenn Dein Einlesen und die Bearbeitung geklappt hat.

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 12:30
von ahartwig
Danke schon mal für Ansatz.
Allerdings bekomme ich mit dem Tool CSVed keine Teilung in Sätze á 30 Zeichen hin. Ich habe keine Möglichkeit gefunden, wie das damit gehen könnte (auch eine kleine Datenmenge genommen). Bisher habe ich noch kein anderes Tool gefunden.
Schönen Gruß

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 13:57
von komma4
Tja - ich kenne die Funktionalität von CSVed an dieser Stelle ( Tab "Modify 2" , 3. Spalte: "Split Column @ Position" ), habe es bei Versuchen vorhin aber auch nicht hinbekommen.

Was mir die OOo Basic Hilfe noch sagte: bei der OPEN-Anweisung könne ich auch einen Parameter LEN für die Datensatzlänge mit angeben. Bin da aber auch nicht weiter gekommen - es kam heute morgen noch ein Stapel Arbeit dazwischen....

Viel Erfolg!

Daten sind in ooBase drin

Verfasst: Mo, 03.12.2007 14:39
von ahartwig
Der Ansatz für sich hat mich aber schon weiter gebracht
Ich habe mit Hilfe eines kleinen Programmes die Zeilentrennung hinbekommen und jetzt sind die Daten in ooBase drin.
Jetzt kommt der Rückweg.
Und nochmals danke

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 16:56
von komma4
zum Exportieren:

entweder die geänderten Daten in der Base-Tabelle anzeigen lassen, nach Calc übernehmen und hier exportieren -
oder -
mit einem SQL-Befehl (Befehlsfenster in Base) auslesen lassen:

Code: Alles auswählen

SELECT * INTO TEXT "ausgabe.csv" FROM "tabellenname"

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 17:35
von ahartwig
Also erstmal nochmal ein Dankeschön.
Also im Prinzip funktioniert das alles so (der SQL zum Speichern in einer Data läuft nicht).
Es allerdings nicht das was ich suche. Ich denke ich habe mich wohl auch nicht genau genug ausgedrückt.
So wie beschrieben brauche ich keinerlei Base, noch Programmierung, das könnte komplett in Calc passieren.
Mein Ziel war es aber die Datei über Base (BASIC) auszulesen und in einer Tabelle abzulegen und nach Datenmanipulation wieder in einer Datei abzulegen, die das gleiche Format hat wie die Ausgangsdatei, nämlich gar keines.
Es muss doch eine Möglichkeit geben, zeichenweise aus einer Datei zu lesen.
Es ist 10 Jahre her, dass ich soetwas mit VBA gemacht habe, daher möchte ich das hier als Übung ansehen. Es ist wirklich schwierig im Internet dazu etwas zufinden.
Ich möchte hier auch gar keine Komplettlösung haben, ein Ansatz oder ein Verweis auf ein Dokument würde mir auch sehr helfen.
Im Moment scheitere ich schon an so einfachen Dingen, wie über BASIC in Base Variablen mit den Daten einer Abfrage zu füllen.

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 17:40
von komma4
Dann verstehe ich Deine Frage nicht...?
Was suchst Du? Die BASIC-Anweisungen, um eine Abfrage zu formulieren und auszuführen? Die Anweisungen, um den Export in die CSV-Datei als SQL mit BASIC zu gestalten...?

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 17:46
von Stephan
Aufgrund der Länge kann ich sie nicht in einen String laden und dann via Stringfunktionen, die Datensätze exstrahieren.
Du kannst die Datei direkt in OOo öffnen, dabei erzeugt OOo zwangsweise Absätze mit maximal 64k Zeichen, diese Absätze kannst Du absatzweise auslesen.

(nicht aktuell getestet, sollte aber gehen)



Gruß
Stephan

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 17:55
von ahartwig
Erstmal geht es um das einlesen der Datei, die aus einer Zeile mit 400.000 Zeichen besteht.
Zwei Zeichen lesen, einer Variablen zuweisen, sieben Zeichen lesen, zuweisen, ... bis 31 Zeichen, dann ist ein Record komplett, soll als solcher in die Tabelle geschrieben werden, und dann wieder zwei Zeichen lesen. Sequentielles Auslesen aus der Datei.
Die Daten in der Tabelle können, wenn alles vorbei ist ganz normal manipuliert werden. Zu einem bestimmten Zeitpunkt muss der Inhalt der Tabelle wieder in eine Datei mit dem selben Format geschrieben werden (s.o.) damit sie vom Host verarbeitet werden kann.
Was ich verhindern möchte ist, von einem Format ist nächste, dann von Calc nach Base irgenwann wieder zurück, und zum Schluss alle Sonderzeichen händisch wieder entfernen, denn es darf keine CSV Datei sein am Schluss.

Hier ist mal ein Auszug aus der Datei:

09010100002007200710000000000000000006661368000011000000000000000000666140200002500000000000000000066614460000230000000000000000006661480000015000000000000000003197104800003700000000000000000326710420000040000000000000000032671048000016000000000000000003726036800002100000000000000000372604020000290000000000000000037260446000022000000000000000003726048000001200000000000000000482610340000530000000000000000048261036000065000000000000000004826103800009700000000000000000482610400001070000000000000 ...

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 17:57
von ahartwig
Stephan hat geschrieben:
Aufgrund der Länge kann ich sie nicht in einen String laden und dann via Stringfunktionen, die Datensätze exstrahieren.
Du kannst die Datei direkt in OOo öffnen, dabei erzeugt OOo zwangsweise Absätze mit maximal 64k Zeichen, diese Absätze kannst Du absatzweise auslesen.

(nicht aktuell getestet, sollte aber gehen)



Gruß
Stephan
Wenn ich das mache öffnet er sie mir im Writer. :(

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Mo, 03.12.2007 18:11
von Stephan
Wenn ich das mache öffnet er sie mir im Writer.
Ja, natürlich, das ist doch Sinn der Sache. Wenn Sie in Writer offen ist kannst Du anschließend auslesen was Du willst und das neu zusammenstellen. Ich denke genau darum gings, einen sehr langen String in Teilstrings zu zerlegen um die weiterbesarbeiten zu können.



Gruß
Stephan

Re: Lange Hostdatei parsen, wie geht das?

Verfasst: Di, 04.12.2007 16:15
von ahartwig
So, das Schreiben in die Datei habe ich jetzt erledigt. Jetzt werde ich mal versuchen, die Tabelle von der Datei aus zu füllen.
Damit man verstehen kann was ich meinte (Aufgrund der Größe zu Testzwecken auf 10 Sätze beschränkt):

Sub setDataToFile
Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim InteractionHandler as Object
Dim Statement As Object
Dim ResultSet As Object

Dim iNumber As Integer
Dim sZeile As String
Dim aFile As String
Dim sMsg as String

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("HostData")

If Not DataSource.IsPasswordRequired Then
Connection = DataSource.GetConnection("","")
Else
InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
Connection = DataSource.ConnectWithCompletion(InteractionHandler)
End If

Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT * FROM ""tblHostData""")

aFile = "C:\Daten\HostData\daten.txt"
iNumber = Freefile
Open aFile For Output As #iNumber

If Not IsNull(ResultSet) Then
For I = 1 to 10
ResultSet.next
Print #iNumber, ResultSet.getString(1) + ResultSet.getString(2) + ResultSet.getString(3) + ResultSet.getString(4) + ResultSet.getString(5) + ResultSet.getString(6);
Next I
Print #iNumber, ""
Close #iNumber
End If
End Sub