AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeilen in einem String zählen

Ein Thema von lbccaleb · begonnen am 8. Mai 2012 · letzter Beitrag vom 9. Mai 2012
Antwort Antwort
Seite 2 von 3     12 3      
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#11

AW: Zeilen in einem String zählen

  Alt 8. Mai 2012, 17:41
Also ich finde eine For-Schleife am einfachsten zu lesen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

AW: Zeilen in einem String zählen

  Alt 8. Mai 2012, 18:02
Ich geb's zu, sowas wie mit der Stringliste nutze sich selber ab und zu.
Denn es ist schön kleiner Code, welcher garantiert funktioniert (Bugs sind so gut wie ausgeschlossen)
und wenn es nicht auf die letzte Millisekunde drauf ankommt und wenn der Speicher nicht relevant ist, dann stört es absolut nicht, wenn intern etwas mehr gemacht wird.


z.B. für's Anpassen der Zeilenumbrüche, wo dann unter #10, #13 und #13#10 in das passende format konvertiert werden (unter Windows nach #13#10)
Delphi-Quellcode:
S := 'abc'#10'xyz';

with TStringList.Create do
  try
    Text := S;
    S := Text;
  finally
    Free;
  end;

// S = 'abc' + sLineBreak + 'xyz';
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#13

AW: Zeilen in einem String zählen

  Alt 8. Mai 2012, 18:14
Was ist denn der Unterschied zwischen den beiden Versionen? ausser das die von himitsu ne ganze Ecke unübersichtlicher ist^^

Delphi-Quellcode:
function CountLines(const S: string): Integer;
var
  P: PChar;
begin
  if S <> 'then begin
    Result := 1;
    P := PChar(S);
    while P^ <> #0 do begin
      if P^ = #13 then begin
        Inc(Result);
        if (P + 1)^ = #10 then
          Inc(P);
      end else if P^ = #10 then
        Inc(Result);
      Inc(P);
    end;
  end else
    Result := 0;
end;
Oder den hier
Delphi-Quellcode:
Function CountCRLF (Const aString : String) : Integer;
Var
  i : Integer;
Begin
  Result := 0;
  For i:=1 to Length(aString)-1 do
    if (aString[i]=#13) and (aString[i+1]=#10) then
      inc(Result);
End;
Ist die schneller?
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

AW: Zeilen in einem String zählen

  Alt 8. Mai 2012, 18:21
Leztere zählt nur CRLF (#13#10).

Erstere beachtet #10 (Linux), #13 (Mac) und #13#10 (Windows).
Und sieh zählt korrekt.
- leerer String = keine Zeile / könnte man aber auch als eine Leerzeile betrachten
- kein Zeilenumbruch = 1 Zeile
- 1 Zeilenumbruch = 2 Zeilen
- 2 Zeilenumbrüche = 3 Zeilen
- 3 Zeilenumbrüche = 4 Zeilen
- ...

Und in Bezug auf die #0, gibt es einen Unterschied.
Bei PChar ist dort Schluß, während der Delphi-String theoretisch noch weitergehn könnte.


Direkt als String (ohne PChar):
Delphi-Quellcode:
function CountLines(const aString: string): Integer;
var
  i: Integer;
begin
  if aString <> 'then begin
    Result := 1;
    i := 1;
    while i <= Length(aString) do
      if aString[i] = #13 then begin
        Inc(Result);
        if (i < Length(aString)) and (aString[i + 1] = #10) then
          Inc(i);
      end else if aString[i] = #10 then
        Inc(Result);
  end else
    Result := 0;
end;
$2B or not $2B

Geändert von himitsu ( 8. Mai 2012 um 18:29 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#15

AW: Zeilen in einem String zählen

  Alt 8. Mai 2012, 20:53
@lbccaleb

Die oben schon erwähnte TStringList ist wohl die Einfachste Methode. Text ist ein StringList laden, Count lesen, fertig. Warum nicht die Möglichkeiten von Delphi nutzen wenn sie da sind.

Erst wenn es wichtig ist ressourcesparend oder ultraschnell zu arbeiten, könnte man sich was anderes nehmen.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#16

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 09:54
...
Die oben schon erwähnte TStringList ist wohl die Einfachste Methode. Text ist ein StringList laden, Count lesen, fertig. Warum nicht die Möglichkeiten von Delphi nutzen wenn sie da sind.
...
Naja, das ist einfach. Ich kann die nicht benutzen da es bei mir nonVCL ist. Also gibs da keine StringList oO

Aber nocheinfacher finde ich eigentlich die CountCRLF funktion. Die ist einfach und erfüllt ihren Zweck super
Das von himitsu ist bestimmt besser, aber da brauch man ne ganze Weile sich da rein zu finden, wenn man sich das ganze selber beigebracht hat....
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#17

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 09:59
Ich sehe hier eine Ungereimtheit:

In CountLines:

Delphi-Quellcode:
while P^ <> #0 do begin
      if P^ = #13 then begin
        Inc(Result); //wenn true, dann INC(Zeilenzahl)
        if (P + 1)^ = #10 then
          Inc(P); //wenn true, dann INC(StrPos)
      end else if P^ = #10 then
        Inc(Result); //wenn true, dann INC(Zeilenzahl)
      Inc(P); //und hier dann ei 2. Mal INC(StrPos), wenn
              //if Zweig durchlaufen
   end;
Oder hab ich hier einen Denkfehler?
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#18

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:06
Eventuell wird es einfacher/übersichtlicher, wenn du das letzte Inc(P), also das der Schleife, mit in die IFs aufnimmst
Delphi-Quellcode:
while P^ <> #0 do
  if P^ = #13 then begin
    Inc(Result);
    if (P + 1)^ = #10 then
      Inc(P);
    Inc(P); {<<<}
  end else if P^ = #10 then begin
    Inc(Result);
    Inc(P); {<<<}
  end else
    Inc(P); {<<<}
und dann noch etwas an der Reihenfolge veränderst.
Delphi-Quellcode:
while P^ <> #0 do
  if P^ = #13 then begin
    Inc(Result);
    Inc(P); {<<<}
    if P^ = #10 then {<<<}
      Inc(P);
  end else if P^ = #10 then begin
    Inc(Result);
    Inc(P);
  end else
    Inc(P);
$2B or not $2B

Geändert von himitsu ( 9. Mai 2012 um 10:10 Uhr)
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:07
Delphi-Quellcode:
function CountLines(const aString: string): Integer;
var
  i: Integer;
begin
  if aString <> 'then begin
    Result := 1;
    i := 1;
    while i <= Length(aString) do
      if aString[i] = #13 then begin
        Inc(Result);
        if (i < Length(aString)) and (aString[i + 1] = #10) then
          Inc(i);
      end else if aString[i] = #10 then
        Inc(Result);
  end else
    Result := 0;
end;
Ist das korrekt, dass mit #13 die Zeilenzahl inkrementiert wird? Das Carriage Return springt doch nur wieder an den Anfang derselben Zeile, ist also logisch keine neue Zeile.
Wäre es nicht ausreichend, anhand eines gefundenen Linefeeds hochzuzählen?

Delphi-Quellcode:
function CountLines(const aString: string): Integer;
var
  i: Integer;
begin
  if aString <> 'then begin
    Result := 1;
    i := 1;
    while i <= Length(aString) do
      if aString[i] = #10 then
        Inc(Result);
  end else
    Result := 0;
end;
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#20

AW: Zeilen in einem String zählen

  Alt 9. Mai 2012, 10:18
Da hab ich auch noch einen ohne Pointer, sollte mit #10, #13 und #13#10 zurechtkommen.
Delphi-Quellcode:
function CountLines(const s: string): integer;
var
  PrevCR: Boolean; //Previous Carriage Return
  i: integer;
begin
  Result := 0;
  PrevCR := false;
  for i := 1 to Length(s) do
    case s[i] of
      #13:
        begin
          Inc(Result);
          PrevCR := true;
        end;
      #10:
        begin
          if not PrevCR then
            Inc(Result);
          PrevCR := false;
        end;
      else
        PrevCR := false;
    end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 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