Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Datei nummeriert speichern (https://www.delphipraxis.net/16891-datei-nummeriert-speichern.html)

Dragon27 25. Feb 2004 08:54


Datei nummeriert speichern
 
Hallo,

als ich benutze das Synedit. Ich weiß dess es nummeriert aber es soll folgendermaßeb sein:

Die dateien sehen so aus:

1 dfgsdf
2 dfasdfa
3 dfasdfsadf
4 fasdfasdfadsf
5 etc.

die nummern sollen beim laden entfernt werden, ich habe dazu folgendes gemacht:
Delphi-Quellcode:
// Proceduren für das auseinandernehmen eines Strings

procedure GetWords(TheString, Separator: String; var Strings: TStringList);
begin
  try
    Strings.Clear;
    while Pos(Separator, TheString)>0 do
    begin
      Strings.Add(Copy(TheString, 1, Pos(Separator, TheString)-1));
      TheString:=Copy(TheString, Pos(Separator, TheString)+Length(Separator),
      Length(TheString));
    end;
    Strings.Add(TheString);
  except
  end;
end;

function WordCount(TheString, Separator: String): Integer;
var OurStrings: TStringList;
begin
  OurStrings:=TStringList.Create;
  GetWords(TheString, Separator, OurStrings);
  result:=OurStrings.count;
  OurStrings.free;
end;



function GetWord(TheString, Separator: String; Nummer: Integer): String;
var OurStrings: TStringList;
begin
  OurStrings:=TStringList.Create;
  GetWords(TheString, Separator, OurStrings);
  try
    result:=OurStrings[Nummer-1];
  except
    result:=''
  end;
  OurStrings.free;
end;

// richtiger Text

zahl:=-1;
 while zahl+2<=synmemo1.Lines.Count do begin
 zahl:=zahl+1;
 form1.synmemo1.Lines.Add(getword(synmemo1.Lines.Strings[zahl],' ',2));
 ladenP.Position:=zahl;
 end;
Also ihr verteht ich mach da jede Zeile einzeln durch und des dauert hald ungemein lange wisst ihr wie mann dabei Zeit sparen kann? Oder eine ander Möglichkeit?

Danke

lorenz 25. Feb 2004 09:02

Re: Datei nummeriert speichern
 
Hallo Dragon27,

warum müssen denn die Dateien nummeriert gespeichert werden? :gruebel:

MfG

Lorenz

Robert_G 25. Feb 2004 09:14

Re: Datei nummeriert speichern
 
Erstens:
So sollte es aussehen, wenn man dynamisch Objekte erzeugt und freigibt.
Delphi-Quellcode:
  XXX.Create;
  Try
    ...
  Finally
    FreeAndNil(XXX);
  End;
Das hier dürfte doch reichen, um von allen Zeilen die ersten zwei Stellen abzuschneiden (ungetestet!):

Delphi-Quellcode:
Var
  flStrList                            : TStringList;
  DeinFileName                         : String;
  Zahl                                 : Integer;
  ...
Begin
  ...
  flStrList := TStringList.Create;

  Try
    flStrList.LoadFromFile(DeinFileName);
    Zahl := 0;
    While zahl < pred(flStrList.Count) Do
    Begin
      // ladenP.Position := zahl;
      flStrList[Zahl] := Copy(flStrList[Zahl], 3, Length(flStrList[Zahl]));
      inc(Zahl);
    End;
    Form1.SynMemo1.Lines.Assign(flStrList);
  Finally
    FreeAndNil(flStrList);
  End;
Nachtrag: @lorenz
Ich glaube er hat die Nummern in der Datei und will sie nicht mehr im SynMemo haben.

Edit: schnell hingehackt und voller Bugs :oops: -> korrigiert

Matze 25. Feb 2004 09:16

Re: Datei nummeriert speichern
 
Aber es sind ja nicht immer nur 2 Stellen, die wegkommen, da müsste man evtl. noch mit pos die erste Leerstelle herausfinden.

Robert_G 25. Feb 2004 09:20

Re: Datei nummeriert speichern
 
:wall: natürlich... :oops:
Ist ja auch noch mitten in der Nacht :stupid:

Dragon27 25. Feb 2004 09:30

Re: Datei nummeriert speichern
 
hallo,

also zu eurer Info, es geht hier um die Heidenhein-Programmiersprache mit der werden CNC-maschinen programmiert und zum editieren sollen natürlich die Zeilennummern nicht angezeigt werden aber nachher in der gespeicherten Datei schon wieder. Da die Maschine das für eine GOTO funktion benötigt.

Habt ihr da echt keine schnelle Lösung habe da ein DOS-Programm und da geht das wie aus der Pistole geschossen oder ist am Ende Delphi schlechter wie manches DOS programm? *g*

Danke für eure Antworten

Robert_G 25. Feb 2004 09:50

Re: Datei nummeriert speichern
 
Der Code hat gerade 15.000 Zeile in unter 1 Sek. eingelesen (und das auf einer AMD Möhre!)

Robert_G 25. Feb 2004 09:55

Re: Datei nummeriert speichern
 
Und damit klappt's auch mit dem Nachbarn:
Delphi-Quellcode:
Var
  flStrList                            : TStringList;
  DeinFileName                         : String;
  Zahl, StartPos                       : Integer;
Begin
  If Not opendialog1.Execute Then Exit;
  DeinFileName := OpenDialog1.FileName;

  flStrList := TStringList.Create;

  Try
    flStrList.LoadFromFile(DeinFileName);
    Zahl := 0;
    While Zahl < pred(flStrList.Count) Do
    Begin
      // ladenP.Position := zahl;
      StartPos := Pos(#32, flStrList[Zahl]);
      inc(StartPOs);
      flStrList[Zahl] := Copy(flStrList[Zahl], StartPos, Length(flStrList[Zahl]));
      inc(Zahl);

    End;
    SynMemo1.Lines.Assign(flStrList);
  Finally
    FreeAndNil(flStrList);
  End;

Dragon27 25. Feb 2004 09:55

Re: Datei nummeriert speichern
 
hallo Robert,

da geht es nicht um 15000 Zeile sondern um runde 2,5 Mio. Zeile weil dieser Text von AutoCAD kommt trotzdem probiere ich es nochmal danke für dein posting!

Dragon27 25. Feb 2004 10:01

Re: Datei nummeriert speichern
 
hallo Robert,


also hab des nochmal probiert funktioniert wunderbar!!!
Wirklich toll danke!
Aber ich kenn mich da net ganz so aus also fällt mir des schwer das ganze wieder mit nummern zu speichern kannst du mir da nochmal helfen?

Danke

Robert_G 25. Feb 2004 10:19

Re: Datei nummeriert speichern
 
Beim Speichern musst du einfach nur andersherum denken...
Für DupeString musst du die Unit StrUtils in die Uses-Clause aufnehmen.
Delphi-Quellcode:
Var
  flStrList                            : TStringList;
  DeinFileName                         : String;
  Zahl                                 : Integer;
Begin
  If Not Savedialog1.Execute Then Exit;
  DeinFileName := Savedialog1.FileName;

  flStrList := TStringList.Create;

  Try
    flStrList.Assign(SynMemo1.Lines);
    Zahl := 0;
    While zahl < pred(flStrList.Count) Do
    Begin
      flStrList[Zahl] :=
        IntToStr(succ(Zahl)) +
        DupeString(#32, 7 - Length(IntToStr(succ(Zahl)))) +
        flStrList[Zahl];
      inc(Zahl);

    End;
    flStrList.SaveToFile(DeinFileName);
  Finally
    FreeAndNil(flStrList);
  End;
... wenn du den Text nicht unbeding perfekt eingerückt (hier 7 Stellen) brauchst, kannst du anstatt "DupeString..." auch ein #32 nehmen.
Nachtrag: Wenn du den Text ausrichtest, musst du beim Einlesen diesen Wert verwenden (anstatt "Pos(#32, flStrList[Zahl])")
-> sonst sieht man die ganzen Leerzeichen.

fkerber 25. Feb 2004 10:25

Re: Datei nummeriert speichern
 
Hi!

Probier mal, ob das geht:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
strlist: Tstringlist;
begin
i:=0;
strlist := TStringList.Create;

  Try
    StrList.Assign(Synmemo1.Lines);
    Synmemo1.Clear;
    While i <= pred(StrList.Count) Do
      begin
        synmemo1.Lines.Add(inttostr(i+1)+' '+Strlist[i]);
        i:=i+1;
      end;
  Finally
    FreeAndNil(StrList);
  end;
end;
Ich hoffe, dass der Code in Ordnung ist. Habe mich noch nicht so wirklich damit auseinandersetzen können. Falls Fehler drin sind, oder die Vorgehensweise nicht ok ist, sagt Bescheid.

Ciao fkerber

Edit:
a) zu langsam
b) @Robert_G: Ist mein Code in Ordnung, oder nicht empfehlenswert?

Dragon27 25. Feb 2004 10:33

Re: Datei nummeriert speichern
 
Zitat:

.. wenn du den Text nicht unbeding perfekt eingerückt (hier 7 Stellen) brauchst, kannst du anstatt "DupeString..." auch ein #32 nehmen.
Nachtrag: Wenn du den Text ausrichtest, musst du beim Einlesen diesen Wert verwenden (anstatt "Pos(#32, flStrList[Zahl])")
-> sonst sieht man die ganzen Leerzeichen.
Ähm wie bitte? Was ist #32?? und Dupestring wo is der unterschied sorry aber hab sowas noch nie gemacht


in der Delphiholfe steht folgendes:

Zitat:

Die Funktion gibt die mehrfache Verkettung eines Strings mit sich selbst zurück. Die Anzahl der Wiederholungen kann angegeben werden.

Unit

StrUtils

Kategorie

String-Verarbeitung

Delphi-Syntax:

function DupeString(const AText: string; ACount: Integer): string;

C++ Syntax:

extern PACKAGE AnsiString __fastcall DupeString(const AnsiString AText, int ACount);

Beschreibung

DupeString gibt einen String zurück, der ACount Wiederholungen des Strings AText enthält. Ein Beispiel:

S := DupeString('Ha', 5);

Diese Anweisung gibt den String 'HaHaHaHaHa' zurück.

Danke

P.s.: Will ja nicht nur den code kopieren sondern ihn auch verstehen *g* was ja manche nicht so nehmen

Robert_G 25. Feb 2004 10:50

Re: Datei nummeriert speichern
 
DupeString('Hallo', n) wiederholt einen String ('Hallo') n-mal.

#32 ist der ASCII-Code für ein Leerzeichen, ich verwende selten ' ' in meinem Code(außer bei SQL-Statements), da man beim schnellen Durchscrollen nicht sofort sieht ob da nicht jemand einen Tab (#9) reingesetzt hat.

succ(Zahl) liefert den Nachfolger
pred(Zahl) -"- Vorgänger

inc(Zah) entspricht: Zahl := Zahl + 1;
dec(Zah) entspricht: Zahl := Zahl - 1;

Length(IntToStr(Zahl)) gibt dir die Länge von "Zahl"


DupeString(#32, 7 - Length(IntToStr(succ(Zahl)))) gibt dir deshalb: 7 - "Länge von Zahl" Leerzeichen.
Das meinte ich mit einrücken:
Im SynMemo:
Code:
CREATE OR REPLACE TRIGGER ctsdd.rule_change
before update or delete of object_id on ctsdd.rule
for each row
BEGIN

  IF updating THEN
    UPDATE ctsdd.extended_rule
in der Datei

Code:
15646  CREATE OR REPLACE TRIGGER ctsdd.rule_change
15647  before update or delete of object_id on ctsdd.rule
15648  for each row
15649  BEGIN
15650 
15651   IF updating THEN
15652     UPDATE ctsdd.extended_rule

Dragon27 25. Feb 2004 11:02

Re: Datei nummeriert speichern
 
hi, danke für die lange Erklärung nett von dir!

Eine Frage bleibt noch offen wie mache ich es dass er immer bei der Nummerierung mit 0 anfängt (dass ist ganz wichtig)!
hab da das schon so probiert:

Delphi-Quellcode:

Var
  flStrList                            : TStringList;
  DeinFileName                         : String;
  Zahl                                 : Integer;
Begin
  If Not form1.Savedialog1.Execute Then Exit;
  DeinFileName := form1.Savedialog1.FileName;

  flStrList := TStringList.Create;

  Try
    flStrList.Assign(form1.SynMemo1.Lines);
    Zahl := -1;
    While zahl < pred(flStrList.Count) Do
    Begin
      inc(Zahl);
      flStrList[Zahl] :=
        IntToStr(succ(Zahl)) +
        DupeString(#32, 7 - Length(IntToStr(succ(Zahl)))) +
        flStrList[Zahl];


    End;
    flStrList.SaveToFile(DeinFileName);
  Finally
    FreeAndNil(flStrList);
  End;
aber er fängt trotzdem bei 1 an. Warum?

Danke

fkerber 25. Feb 2004 11:12

Re: Datei nummeriert speichern
 
Hi!

Ich glaube, es müsste so heißen;

Delphi-Quellcode:
Try
    flStrList.Assign(form1.SynMemo1.Lines);
    Zahl := 0;
    While zahl < pred(flStrList.Count) Do
    Begin
      inc(Zahl);
      flStrList[Zahl] :=
        IntToStr(Zahl) +   //<-- hier
        DupeString(#32, 7 - Length(IntToStr(succ(Zahl)))) + 
        flStrList[Zahl];
ciao fkerber

Dragon27 1. Mär 2004 12:51

Re: Datei nummeriert speichern
 
Zitat:

Zitat von Robert_G
DupeString('Hallo', n) wiederholt einen String ('Hallo') n-mal.

#32 ist der ASCII-Code für ein Leerzeichen, ich verwende selten ' ' in meinem Code(außer bei SQL-Statements), da man beim schnellen Durchscrollen nicht sofort sieht ob da nicht jemand einen Tab (#9) reingesetzt hat.

succ(Zahl) liefert den Nachfolger
pred(Zahl) -"- Vorgänger

inc(Zah) entspricht: Zahl := Zahl + 1;
dec(Zah) entspricht: Zahl := Zahl - 1;

Length(IntToStr(Zahl)) gibt dir die Länge von "Zahl"


DupeString(#32, 7 - Length(IntToStr(succ(Zahl)))) gibt dir deshalb: 7 - "Länge von Zahl" Leerzeichen.
Das meinte ich mit einrücken:
Im SynMemo:
Code:
CREATE OR REPLACE TRIGGER ctsdd.rule_change
before update or delete of object_id on ctsdd.rule
for each row
BEGIN

  IF updating THEN
    UPDATE ctsdd.extended_rule
in der Datei

Code:
15646  CREATE OR REPLACE TRIGGER ctsdd.rule_change
15647  before update or delete of object_id on ctsdd.rule
15648  for each row
15649  BEGIN
15650 
15651   IF updating THEN
15652     UPDATE ctsdd.extended_rule


Hallo,

also hab jetzt mal a bisserl hin und her probiert und jetzt funzt diese Procedur oben schon recht gut nur sollten jetzt keine einrückungen mehr beachtet werden also aus dem:

Code:
15647  before update or delete of object_id on ctsdd.rule
15648  for each row
15649  BEGIN
15650 
15651   IF updating THEN
15652     UPDATE ctsdd.extended_rule
soll das werden:

Code:
15647  before update or delete of object_id on ctsdd.rule
15648  for each row
15649  BEGIN
15650 
15651  IF updating THEN
15652  UPDATE ctsdd.extended_rule
nun ist die frage, geht das mit diesem misteriösen "-7" :witch: oder wie soll ich das anfangem? Ich habe da echt null peil

Danke für eure Hilfe


Gruß

Andy


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz