Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Erfassen und verarbeiten von Textdateien (https://www.delphipraxis.net/97102-erfassen-und-verarbeiten-von-textdateien.html)

paule42 4. Aug 2007 19:07


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

DGL-luke 4. Aug 2007 19:11

Re: Frage eines Anfängers
 
Hallo,

die TStringList kann ihre strings valuelist-mäßig organisieren: http://www.delphipraxis.net/internal...t.php?t=112794

Wenn du als NameValueSeparator das Leerzeichen einträgst, solltest du die strings einzeln rausholen und neu anordnen (in deiner sortierung) können.

Phoenix 4. Aug 2007 19:12

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

grenzgaenger 5. Aug 2007 14:05

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:
type titem = class
 addresse: string; //für deine daten
 kommendar: string;
 ....
end;
b) definition eines containers für deine items, welche du aus dem flat file herausgesucht hast..
Delphi-Quellcode:
type tItemList = class(tObjectList)
//deine methoden
 procedure load;
 procedure save(filename: string);
end;
c) einlesen deines flat files und speichern der selektierten daten
Delphi-Quellcode:
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;
d) noch deine codierung für save hinterlegen
Delphi-Quellcode:
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;
e) und dann noch abspeichern deiner daten
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

Apollonius 5. Aug 2007 14:12

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.

sniper_w 5. Aug 2007 14:30

Re: Frage eines Anfängers
 
Zitat:

ohne Objektorientierung
und TStringList steht im Konflikt. Mit TStringList geht es eben Objektorientiert weiter.

Apollonius 5. Aug 2007 14:58

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.

paule42 5. Aug 2007 17:23

Re: Frage eines Anfängers
 
Zitat:

Zitat von Phoenix
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 ;-)

Danke für die nette Begrüßung! Ich bin natürlich nicht böse und immer noch lernfähig. :spin2:
Habe den Hinweis sofort beherzigt.

grenzgaenger 5. Aug 2007 17:47

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.

Apollonius 5. Aug 2007 18:07

Re: Erfassen und verarbeiten von Textdateien
 
Ich würde ja eine TStringlist nehmen und durchiterieren, als mir da mit eigenen Klassen einen abzufrickeln.

paule42 6. Aug 2007 15:04

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

paule42 6. Aug 2007 15:23

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

DGL-luke 6. Aug 2007 16:06

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]Hier im Forum suchenFormat[/oh] über den Assemblerfile-string jagen, mit den ausgelesenen werten.

5. Das Ergebnis irgendwo hinspeichern.

grenzgaenger 6. Aug 2007 22:39

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:
function SplitAndSave(const item: titem; s: string): tItem;
und der aufruf in etwa so
Delphi-Quellcode:
SplitAndSave(item[i], sl[i]);
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.

grüsse und noch viel erfolg
gg

DGL-luke 6. Aug 2007 22:41

Re: Erfassen und verarbeiten von Textdateien
 
Zitat:

Zitat von grenzgaenger
copy/delete/pos

Viel zu viel LOC, viel zu viel möglichkeiten für fehler (insbesondere bei den string-indizes).
Mit der TStringList sollte das alles wunderbar funktionieren.

paule42 7. Aug 2007 15:29

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