Mit Count nach ganzem Alphabet suchen?

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
12 Beiträge • Seite 1 von 1
12 Beiträge Seite 1 von 1

Mit Count nach ganzem Alphabet suchen?

Beitrag von Nion (ForumUser / 17 / 20 / 1 ) »
Moin tosomen,

folgendes "Problem":

Ich möchte in einem frei wählbaren Text wissen, wie oft die einzelnen Buchstaben vorkommen.
Jetzt kann ich das natürlich für jeden möglichen Buchstaben durchlaufen lassen, so wie hier:

counter = count( val = text sub = 'a' ).
IF text CA 'a'.
WRITE: / 'a:' , counter.
ENDIF.

Aber: gibt es eine Möglichkeit, dass das Programm direkt nach dem kompletten Alphabet (evtl plus Sonderzeichen) sucht, ohne dass ich 26 Mal diese Abfrage starten muss?
Wenn ich einfach sy-abcde als sub angebe, geht es schon mal nicht :)

Vielen Dank schon mal,
Nion
Man muss nicht alles wissen. Man muss nur wissen, wo es steht oder wen man fragen kann.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von Nion (ForumUser / 17 / 20 / 1 ) »
Okay, manchmal stößt man auf die Antwort, sobald man die Frage gestellt hat.
Das geht natürlich relativ stressfrei mit 'ner Tabelle. Da muss ich zwar die Buchstaben trotzdem einmal alle angeben, aber immerhin geht das dann in einem Rutsch durch.
Man muss nicht alles wissen. Man muss nur wissen, wo es steht oder wen man fragen kann.

Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von sap_enthusiast (ForumUser / 95 / 25 / 23 ) »
Ich meine mit einem While-Schleife könntest den Inhalt von sy-abcde durch offset in einer Tabelle mit itab = value #( base itab ..... erfassen und dann sollst keine literale verwenden

Folgende Benutzer bedankten sich beim Autor sap_enthusiast für den Beitrag:
Nion


Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Wie hast du es denn gelöst, Nion?

Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von Nion (ForumUser / 17 / 20 / 1 ) »
ewx hat geschrieben:
24.02.2023 12:05
Wie hast du es denn gelöst, Nion?
Edit: Das Endprodukt.

DATA: text TYPE string,
position TYPE sy-index,
laenge TYPE string,
lv_proz TYPE i,
BEGIN OF ls_tab,
buchst TYPE c,
count TYPE sy-index,
END OF ls_tab,
lt_tab LIKE STANDARD TABLE OF ls_tab.

PARAMETERS:
eingabe TYPE string.

text = eingabe.

CONDENSE text NO-GAPS.

laenge = strlen( text ).

DO laenge TIMES.
position = sy-index - 1 .
IF text+position(1) CA 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÄäÖöÜü.?!'.
ls_tab-buchst = text+position(1).
ls_tab-count = 1.
COLLECT ls_tab INTO lt_tab.

ENDIF.
ENDDO.

SORT lt_tab BY count DESCENDING.
LOOP AT lt_tab INTO ls_tab.
lv_proz = ( ( ls_tab-count * 100 ) / laenge ).
WRITE: / 'Der Buchstabe', ls_tab-buchst, 'kommt im Text', ls_tab-count ,'Mal vor, das sind' ,lv_proz ,'%'.
ENDLOOP.

Folgende Benutzer bedankten sich beim Autor Nion für den Beitrag:
ewx

Man muss nicht alles wissen. Man muss nur wissen, wo es steht oder wen man fragen kann.

Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Danke für deine Lösung!
Es ist jedoch gar nicht nötig, das ganze Alphabet durchzuflöhen. Du müsstest nur deinen Text analysieren und die Zeichen zählen, die auch vorkommen.
Was ist z.B. mit französischen oder dänischen Umlauten? Was mit ;-()+~* usw?
Und wenn du bei der Analyse das Zeichen mit to_upper( ) umwandelst, kannst du dir die Groß-/ Kleinschreibung sparen. Es sei denn natürlich, du möchtest explizit Groß- und Kleinbuchstaben zählen. Da kommt es auf die Aufgabenstellung an.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Nion


Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Ich mag so kleine Knobelaufgaben, weil man da eine Menge lernt.
Zu deiner ursprünglichen Frage hätte nämlich die folgende Antwort gepasst:
count_any_of

Ich habe das einmal mit einem REDUCE-Befehl gelöst und einmal im Vergleich klassisch (ohne die Berechnung der prozentualen Verteilung), um zu sehen, welche Schreibweise besser zu verstehen ist.

Code: Alles auswählen.

PARAMETERS word TYPE string DEFAULT 'AAALAAF'.


INTERFACE if_count.
  TYPES: BEGIN OF ts_result,
           char TYPE c LENGTH 1,
           occ  TYPE i,
         END OF ts_result,
         tt_result TYPE SORTED TABLE OF ts_result WITH UNIQUE KEY char.
  METHODS count
    IMPORTING
      word          TYPE string
    RETURNING
      VALUE(result) TYPE tt_result.
ENDINTERFACE.

CLASS sol_reduce DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_count.
ENDCLASS.

CLASS sol_reduce IMPLEMENTATION.
  METHOD if_count~count.
    result = REDUCE if_count=>tt_result(
      INIT res = VALUE #( )
        FOR i = 0 THEN i + 1 WHILE i < strlen( word )
          NEXT res = COND #( WHEN NOT line_exists( res[ char = word+i(1) ] ) THEN
            VALUE #( BASE res (
              char = word+i(1)
              occ  = count_any_of( val = word sub = word+i(1)  ) ) ) ELSE res )  ).

  ENDMETHOD.
ENDCLASS.


CLASS sol_while DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_count.
ENDCLASS.

CLASS sol_while IMPLEMENTATION.
  METHOD if_count~count.

    DATA j TYPE i.

    WHILE j < strlen( word ).
      DATA(current) = word+j(1).
      ADD 1 TO j.
      IF NOT line_exists( result[ char = current ] ).
        INSERT VALUE #( char = current occ = count_any_of( val = word sub = current ) ) INTO TABLE result.
      ENDIF.
    ENDWHILE.

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  DATA(out) = cl_demo_output=>new( ).
  out->write_data( CAST if_count( NEW sol_reduce( ) )->count( word ) ).
  out->write_data( CAST if_count( NEW sol_while( ) )->count( word ) ).

  out->display( ).

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Nion


Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
Besser zu verstehen ist die WHILE-Lösung. Geiler ist die REDUCE-Lösung. In jedem Fall halte ich die Interface-Deklaration in diesem Fall aber für einen Wasserkopf, der nichts anderes macht, als die Lesbarkeit zu verschlechtern. Was da drin steht, hätte auch direkt in die Klassendefinition gekonnt.

Der wesentliche Unterschied zwischen Deiner und seiner Lösung besteht aber darin, dass er noch ABAP von Adolfs Zeiten schreibt, wohingegen Du moderne Syntax einsetzt. Dabei rede ich nicht von ABAP OO. Die neue Syntax wurde mit Release 7.40 eingeführt. Das war im Jahre 2012, ist mittlerweile also 11 Jahre her. Es ist mir völlig unverständlich, weshalb es hier selbst heute noch lauter Neueinsteiger gibt, die noch die alte Syntax von vor dem Jahre 2012 einstudieren und damit dereinst produktive Programme entwerfen wollen.

Nion, bitte schau Dir mal die ABAP 7.40-Syntax an. Und versuche mal, sparsamer mit Feldern umzugehen. Nicht weil viele Felder eine nennenswerte Last für das System darstellen würden (das tun sie nicht), sondern weil unnütze Felder Deinen Code schlechter lesbar machen und Deinen DATA-Block aufblasen. So kannst Du z.B. anstelles Deines

Code: Alles auswählen.

laenge = strlen( text ).

DO laenge TIMES.
einfach Folgendes schreiben:

Code: Alles auswählen.

DO strlen( text ) times.
Perfekt lesbar und verständlich, und Du hast kein Feld laenge mehr herumfliegen, das Du deklarieren musst und nachher nie wieder brauchst.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Nion


Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
@DeathAndPain und ewx
Nion schrieb an anderer Stelle:
Moin,
ich bin komplette Anfängerin (habe vor 1 Woche mit ABAP angefangen) und hoffe, ihr könnt mir helfen, ich stehe etwas auf dem Schlauch.
Ich möchte niemanden zu nahe treten, aber nach 1 Woche ABAP wäre ich mit dem Quellcode von ewx ziemlich überfordert gewesen. Und ich glaube nicht, dass es euch beiden, DeathAndPain und ewx, in derselben Situation anders ergangen wäre.
Es ist richtig, dass die neue Syntax schon mit 7.40 gibt, aber es ist auch eine Frage der Wissensvermittlung, und ob das in den ABAP Kursen so gelehrt wird. Anfängerinnen wie Nion einen Strick daraus zu drehen, finde ich genauso wenig hilfreich wie die von Euch angebotene Lehrmethode "Vogel, friss oder stirb". So was kann ungeheuer demotivierend wirken und abschrecken.
Warum trefft ihr euch nicht einfach in der Mitte?
Für Nion würde das heißen, bereit zu sein, sich mit der Syntax von 7.40 auseinanderzusetzen und sie zu verwenden, für Euch beide würde das heißen, sich in Anfänger, die das ABAP noch aus "Adolfs Zeiten" kennen, hineinzuversetzen und Euren Quellcode für diese Zielgruppe zu kommentieren.

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
Nion


Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
PeterPaletti hat geschrieben:
25.02.2023 04:39
@DeathAndPain und ewx
Nion schrieb an anderer Stelle:
Moin,
ich bin komplette Anfängerin (habe vor 1 Woche mit ABAP angefangen) und hoffe, ihr könnt mir helfen, ich stehe etwas auf dem Schlauch.
Ich möchte niemanden zu nahe treten, aber nach 1 Woche ABAP wäre ich mit dem Quellcode von ewx ziemlich überfordert gewesen. Und ich glaube nicht, dass es euch beiden, DeathAndPain und ewx, in derselben Situation anders ergangen wäre.
Da hast du Recht, das wäre mir genauso gegangen. Und die Lösung mit Reduce hat mich einiges an Kopfzerbrechen gekostet. Deswegen hatte ich gewartet, bis Nion die Lösung gepostet hatte. Dann kann er entscheiden, was er damit/ daraus machen möchte.

Den Hinweis, die funktionale Schreibweise zu benutzen, finde ich jedoch sehr wichtig. Gerade das war es ja, worüber sich fast alle jahrelang - zu Recht - über ABAP lustig gemacht haben, weil genau das nicht ging und es in anderen Programmiersprachen selbstverständlich ist.

Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
PeterPaletti hat geschrieben:
25.02.2023 04:39
@DeathAndPain und ewx
Nion schrieb an anderer Stelle:
Moin,
ich bin komplette Anfängerin (habe vor 1 Woche mit ABAP angefangen) und hoffe, ihr könnt mir helfen, ich stehe etwas auf dem Schlauch.
Ich möchte niemanden zu nahe treten, aber nach 1 Woche ABAP wäre ich mit dem Quellcode von ewx ziemlich überfordert gewesen. Und ich glaube nicht, dass es euch beiden, DeathAndPain und ewx, in derselben Situation anders ergangen wäre.
Da hast du Recht, das wäre mir genauso gegangen. Und die Lösung mit Reduce hat mich einiges an Kopfzerbrechen gekostet. Deswegen hatte ich gewartet, bis Nion die Lösung gepostet hatte. Dann kann er entscheiden, was er damit/ daraus machen möchte.

Den Hinweis, die funktionale Schreibweise zu benutzen, finde ich jedoch sehr wichtig. Gerade das war es ja, worüber sich fast alle jahrelang - zu Recht - über ABAP lustig gemacht haben, weil genau das nicht ging und es in anderen Programmiersprachen selbstverständlich ist.

Re: Mit Count nach ganzem Alphabet suchen?

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
So isses. Ich habe ewx' "Gegenlösung" auch eher als akademisches Beispiel empfunden als als Programmiervorschlag für Nion. Sie hat allerdings die Möglichkeit, sich damit zu beschäftigen und sich (mit Hilfe der ABAP-Hilfe) in die Befehle und die Syntax hineinzudenken, vielleicht auch mal mit dem Debugger nachzuvollziehen. Dabei hat sie den entscheidenden Vorteil, dass sie genau weiß, was der Code tun soll. Das ist der wesentliche Unterschied zu der Situation, wenn man sowas in fremdem Code findet und verstehen möchte, was der Urheber da macht.

Sie kann ja mit der WHILE-Variante anfangen. Die finde ich relativ gut nachvollziehbar. Das mit dem REDUCE kann sie sich im Anschluss ja mal neugierigerweise anschauen. Auch wenn der REDUCE-Befehl aufgrund seines hohen Abstraktionsgrades definitiv nichts für Anfänger ist.

Die 7.40-Syntax umfasst ja nicht nur solche Extreme, sondern durchaus auch Sachen, die auch für Anfänger besser lesbar und verständlich sind.

Code: Alles auswählen.

gesuchter_wert = meinetabelle[ schluessel1 = 'ABC' ]-spalte4.
liest sich nach meiner Überzeugung auch für Anfänger (wenn sie die Syntax verstanden haben) erheblich leichter als

Code: Alles auswählen.

DATA hilfsstruktur LIKE LINE OF meinetabelle.
READ TABLE meinetabelle WITH KEY schluessel1 = 'ABC' INTO hilfsstruktur.
gesuchter_wert = hilfsstruktur-spalte4.
Ich sehe schlicht und ergreifend keinerlei Rechtfertigung mehr, letztere Variante noch zu verwenden oder zu unterrichten (allenfalls um die Lernenden zu befähigen, Altcode noch lesen zu können). (Flame Disclaimer: Bei der oberen Variante muss man natürlich noch die Möglichkeit abfangen, dass in der Tabelle kein passender Wert vorhanden ist. Aber auch mit VALUE...OPTIONAL halte ich es immer noch für leichter lesbar als den unteren Kram.)

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Nion


Seite 1 von 1

Vergleichbare Themen

1
Antw.
1486
Views
Tree mit Alphabet als Knoten
von Brush » 05.04.2006 10:17 • Verfasst in Web-Dynpro, BSP + BHTML
2
Antw.
2491
Views
select count
von bohne » 26.11.2006 22:18 • Verfasst in ABAP® für Anfänger
2
Antw.
4058
Views
SELECT COUNT
von Lamerman » 19.06.2006 10:18 • Verfasst in Web-Dynpro, BSP + BHTML
3
Antw.
3103
Views
Problem mit Select-Count
von debianfan » 27.06.2017 10:47 • Verfasst in ABAP® für Anfänger
5
Antw.
2152
Views
count für mehere Tabelleneinträge
von thomasxy » 11.02.2008 09:28 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 511
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2146
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8742