![]() |
Erfassen und verarbeiten von Textdateien
Hallo, liebe Profis,
wie bereits beschrieben, bin ich Anfänger. Ich habe zwar vor vielen Jahren mal mit Turbopascal 3.0 (unter CPM) programmiert,aber es ist in meinem alten Hirn nicht viel davon übrig geblieben. Um mir und meinen Kollegen die Arbeit zu erleichtern, habe ich es mir in den Kopf gesetzt, mich an einem dafür nötigen Programm zu versuchen. Der Neueinstig fällt mir aber schwer und deshalb hoffe ich, dass ich in diesem Forum ein paar Schläge auf den Hinterkopf als Denkanstoß bekommen kann. Mein Projekt soll folgendes realisieren: Es gibt eine Textdatei, aus der nur einige wenige Strings extrahiert, sortiert und mit zusätzlichen Texten wieder gespeichert werden sollen. Bsp.: ... { positionAufLinie 1 meldergruppenAdresse 20-2 kurzInfo "U1/1/84" kommentar "Flur BTC" stromverbrauch 65 .... Von diesem Ausschnitt benötige ich nur die Infos, die nach "meldergruppenAdresse" "kurzInfo" und "kommentar" enthalten sind. Diese Infos müssen dann nach "meldergruppenAdresse" aufsteigend sortiert und mit zusätzlichen Texten versehen in einer eigenen Datei gespeichert werden. Kann mir dabei hier vielleicht jemand bei der Herangehensweise an das Problem helfen? Um nicht missverstanden zu werden, ich will schon meinen alten Schädel fordern, brauche aber einen oder besser mehrere Denkanstöße, wohin die Richtung gehen soll. Ach so, ja ich habe Delphi 7 und Turbo Delphi 2006. Über eine hilfreiche Antwort würde ich mich freuen. MfG paule42 |
Re: Frage eines Anfängers
Hallo,
die TStringList kann ihre strings valuelist-mäßig organisieren: ![]() Wenn du als NameValueSeparator das Leerzeichen einträgst, solltest du die strings einzeln rausholen und neu anordnen (in deiner sortierung) können. |
Re: Frage eines Anfängers
Hallo Paule,
erstmal herzlich willkommen in der DP. :hi: Und dann gleich noch die obligatorische 'Standpauke' für noch unwissende, die Threads mit dem Titel 'Frage' posten. Bitte nicht böse nehmen ;-) Fragen haben hier eigentlich alle, die was posten. Und Anfänger sind auch viele. Aber jemand, der sich mit einem Bereich auskennt schaut eher nach Themen, die vom Titel her in seinen Bereich passen um sie zu beantworten. Auch unsere Suchfunktion bedankt sich, wenn Threads einen aussagekräftigen Titel haben. Deshalb: Bitte rechts oben bei Deinem Beitrag auf 'Edit' klicken und den Titel in was aussagekräftiges ändern, so dass klar wird, dass es hier um Daten aus Textdateien geht, die verarbeitet werden sollen. Danke :) |
Re: Frage eines Anfängers
hallo paule,
denke, dass es objekt orientiert leichter geht, wie in den TP3 zeiten... daher hier ein paar hinweise, wie du rangehen kannst... a) definition eines containers, als objekt
Delphi-Quellcode:
b) definition eines containers für deine items, welche du aus dem flat file herausgesucht hast..
type titem = class
addresse: string; //für deine daten kommendar: string; .... end;
Delphi-Quellcode:
c) einlesen deines flat files und speichern der selektierten daten
type tItemList = class(tObjectList)
//deine methoden procedure load; procedure save(filename: string); end;
Delphi-Quellcode:
d) noch deine codierung für save hinterlegen
procedure tItemList.load;
var sl: tstringlist; i: integer; item: tItem; begin sl := tstringlist.create; try sl.loadfromfile('dein flat file'); store := false; for i := to sl.count - 1 do begin if sl.item[i] = 'dein vergleichskritierium' then begin item := tIdem.create; item.kommendar := sl.item[i]; item.adresse := sl.item[i+3]; ... add(item); end; end; finally sl.free; end; end;
Delphi-Quellcode:
e) und dann noch abspeichern deiner daten
begin
datei_offnen; for i := 0 to count - 1 do begin formatiere tItem(item[i]).kommendar; formatiere titem(item[i]).....; speichere in datei; end; end;
Delphi-Quellcode:
Itemlist.save('deine datei');
das wäre es so im grossen und ganzen. kannst die ladeprocedure noch etwas optimieren... und deine daten ggf. noch weiter ergänzen... noch viel erfolg und bei fragen, kannst dich gern an das forum wenden. grüsse gg |
Re: Frage eines Anfängers
@grenzgaenger: Das ist doch totaler Overkill! Die Stringlist, wie von DGL-Luke empfohlen, reicht doch völlig. Und das könnte man ohne Objektorientierung schneller machen als auf deine Art.
|
Re: Frage eines Anfängers
Zitat:
|
Re: Frage eines Anfängers
Ich habe nicht bestritten, dass eine Stringlist OOP ist. Ich meinte nur: Es geht selbst mit gutem, altem rewrite/reset und dann read/write schneller, als wenn ich mir erst mal mehrere Klassenn zusammenhacke.
|
Re: Frage eines Anfängers
Zitat:
Habe den Hinweis sofort beherzigt. |
Re: Erfassen und verarbeiten von Textdateien
@Apollonius: klar kann man das mit reset und readln machen. aber ich denke, das ist kompliezierter als ".loadfromfile(...)" anzugeben. je nachdem, wie paule die daten dann abspeichern will, kommt er wohl an writeln nicht vorbei.
als ersatz für die tobjectlist, geht natürlich auch die dynamische speicherverwaltung mit new/dispose und ablegen der fragmente auf den heap. aber da muss er sich um das erstellen und das freigeben des speichers selber kümmern, so dass es mit 'ner tobjectlist wohl schneller geht, als mit 'ner verketteten liste oder 'n array auf pointer... aber warten wir erst mal ab, in welche richtung sein ansatz geht und wo weitere fragen auftreten. |
Re: Erfassen und verarbeiten von Textdateien
Ich würde ja eine TStringlist nehmen und durchiterieren, als mir da mit eigenen Klassen einen abzufrickeln.
|
Re: Erfassen und verarbeiten von Textdateien
Hallo an gg und an Alle, die bisher geantwortet haben. Zuerst natürlich einmal DANKE!
Zum besseren Verständnis meines Projektes sollte ich aber noch ein paar Hinweise geben. Also aus dem Quelltextfile werden nur die Angaben hinter "meldergruppenAdresse, kurzInfo und kommentar" benötigt. Diese sollen dann, aufsteigend nach meldergruppenAdresse, in ein Assemblerfile geschrieben werden. Wobei die Ausgabe im Assemblerfile lückenlos mit 1 beginnen und mit der letzten Adresse aus dem Quellfile enden muss. Alle "leeren" Adressen müssen also auch geschrieben werden. Die Form des Assemblerfiles ist folgende: ... ADR00113: DD ADR00113+ZAHL_UAD_02 ;meldergruppenAdresse 113-1 und 113-2 (also auch sortieren innerhalb der 113-...) DD ADR00113U01 ;unteradresse 1 DD ADR00113U02 ;unteradresse 2 DD ADR00114 ; nächste Adresse (ob im Quelltext vorhanden, oder nicht) ADR00113U01: DB "D EG 225 00" ; Eintrag für Unteradresse 1 ADR00113U02: DB "D EG 225 00" ; Eintrag für Unteradresse 2 ADR00114: DD ADR00114 + KEINE_UAD ; Adresse im Quellfile nicht vorhanden DD ADR00115 ; wieder nachfolgende Adresse DB KEINE_INFO,CR ; kein Eintrag, da nicht vorhanden ... Ich weiss, dass das nicht so einfach zu realisieren ist, schon gar nicht für einen Anfänger. Zumindest möchte ich es probieren um damit meinen Kollegen und mir unzählige Tipparbeiten zu ersparen. Also, für jeden noch so kleinen Tipp bin ich sehr dankbar. Viele Grüße Paule |
Re: Erfassen und verarbeiten von Textdateien
Hallo,
sorry, das hatte ich noch vergessen: der Eintrag bei den Unteradressen entspricht dem ausgelesenen String "kurzInfo". Mit dem Eintrag "kommentar" verhält es sich im Assemblerfile ähnlich. Aber das möchte ich erstmal aussen vor lassen. Wenn ich weiss, wie "kurzInfo" einbezogen wird, kann ich auch den "kommentar" nachrüsten (kommt eh selten vor). Viele Grüße Paule |
Re: Erfassen und verarbeiten von Textdateien
Hallo, folgende Vorgehensweise würde ich dir empfehlen:
1. Assemblerfile mit Platzhaltern versehen. Überall, wo ein String hinmuss, ein %s, überall, wo eine Zahl hinmuss, ein %d. Am besten durchnummerieren: %1s bzw. %2d usw. Das ganze ins programmverzeichnis speichern. 2. In deinem Programm das Textfile auslesen. TStringList erzeugen, NameValueSeparator := #32, Textdatei laden, alle Sachen die du brauchst per Values['key'] auslesen und in Variablen packen 3. Assemblerfile in einen string einlesen 4. [oh] ![]() 5. Das Ergebnis irgendwo hinspeichern. |
Re: Erfassen und verarbeiten von Textdateien
hallo paule,
dann ist's ja easy. da brauchste ja nur, bei jeden string seitwärts zu gehen und dein item zu füllen :-) das kannste ganz bequem mit 'ner procedure machen, der header sieht in etwa so aus...
Delphi-Quellcode:
und der aufruf in etwa so
function SplitAndSave(const item: titem; s: string): tItem;
Delphi-Quellcode:
in der routine zerlegst du dann deinen string mit copy/delete/pos und was dir sonst noch so einfällt und machst 'n add, wenn <>NIL zurückgeliefert wird. in dieser routine oder in deinenm object oder beim save, kannste dann noch allerhand kommentare ergänzen, je nachdem was dir spass macht.
SplitAndSave(item[i], sl[i]);
grüsse und noch viel erfolg gg |
Re: Erfassen und verarbeiten von Textdateien
Zitat:
Mit der TStringList sollte das alles wunderbar funktionieren. |
Re: Erfassen und verarbeiten von Textdateien
Hallo Leute,
da habt Ihr mir ja ein paar ganz schöne Hausaufgaben aufgegeben. Aber auf alle Fälle vielen Dank! Jetzt muss ich mich erst einmal näher mit den Vorschlägen beschäftigen, bin mir aber immer noch unsicher, ob ich das bewältige. Meine Zeiten mit Turbopascal liegen schon Jahrzehte zurück, so dass ich quasi von Vorne anfange. Klar, mein Projekt hört sich absolut simpel an, aber die Umsetzung ist für mich doch nicht so einfach. Aber mit Eurer Hilfe werde ich es bestimmt schaffen :roteyes: .Im Moment werde ich mich nochmal mit den Grundlagen beschäftigen, von denen ich bisher geglaubt habe, sie zu verstehen (beherrschen). Also, tolles Forum hier! Viele Grüße Paule |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz