Einzelnen Beitrag anzeigen

Benutzerbild von JanWe
JanWe

Registriert seit: 23. Mär 2015
Ort: NRW
78 Beiträge
 
Delphi 7 Personal
 
#1

Zeichen in String ersetzen

  Alt 19. Dez 2016, 23:02
Betrifft:
DELPHI 5

Hi,

VORGESCHICHTE:
eine Freundin von mir hat für eine Studie Versuche mit diversen Programmen und Verfahren durchgeführt und diese Ergebnisse mit Programmen wie u.a. SPSS, Excel, usw. bearbeitet.
Doch leider ist es zum Gau gekommen, da sie mehrere OriginalDateien überschrieben hat. (dauert jetzt zu lange das detailliert zu erklären).
Die Daten sind zwar glücklicherweise noch einmal vorhanden, allerdings quer in 1 Datei verwurstet.

PROBLEM:
Jetzt hab ich ihr versprochen, ich würde ihr dabei helfen.
Und hab versucht ein Programm zu entwickeln, das nach Zeichen sucht und diese Daten extrahieren oder zumindest erstmal trennen kann.

Dabei soll bei Auftreten von 3 Zeichenkombinationen wie folgend verfahren werden: (für mich sind es nachher noch mehr, aber wenigstens die schon mal ..)
  1. X01 soll durch den String ' Typ A: ' (steht für Fragetyp A) ersetzt werden
  2. 01 steht für ' Typ B: ' (für Fragetyp B)
  3. die Datenseparator (Komma ',') sollen, falls sie mehrfach vorkommen durch ein einzelnes Vorkommen ersetzt werden

Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var Rest, s, TEX: string;
  Menge, Laenge, i: Integer;
begin
// Beispielkette
  S := '2,9,0171,,25,01640X0174,01747,23,,,,47X014747'; //

  S := '0,,25,01640X0174,01747,23,,,,47X014747'; // vorne gekürzte Kette bringt wieder andere Ergebnisse
  laenge := length(s);
  i := 0;
  Menge := 0;
  while i < laenge do
  begin
    inc(i);
      if (s[i] = 'X') and (s[i + 1] = '0') then // -> x0
    begin
      if (s[i + 2] = '1') then // -> wenn X01
        if Menge > 0 then
        begin
          TEX := TEX + ',' + ' Typ: A ';
          Menge := 0;
        end
        else
          TEX := TEX + ' Typ: A ';
      inc(i);
    end
    else ////////////////////////////////////
      if (s[i] = '0') and (s[i + 1] = '1') then // -> normaler 01
      begin
        if Menge > 0 then
        begin
          TEX := TEX + ' Typ: B '; // Antworttyp
          Menge := 0;
        end
        else TEX := TEX + ',' + ' Typ: B '; // Antworttyp B
        inc(i);
      end
      else ////////////////////////////////////
        if (s[i] = ',') then // DOPPELTE Trenner finden
        begin
          inc(Menge);
        end
        else ////////////////////////////////////

          if Menge > 0 then
          begin
            Caption := s[i];
            if Menge = 1 then
              TEX := TEX + ',' + s[i]
            else
              TEX := TEX + s[i];
           Menge := 0;
          end
          else
        // alles andere
       
            TEX := TEX + s[i]; // alle anderen Zeichen

  end; // END WHILE
  Memo2.text := TEX;
  Memo1.text := S;

end; // Ende Buttonfunktion
Ich hab jetzt seit Freitag immer wieder rumprobiert und mit mehreren Zeichenketten [s.o.] versucht.
Jedes Mal kamen andere, neue Verluste von Zeichen heraus.

Aus der folgenden Zeichenkette z.B.
0,,25,01640X0174,01747,23,,,,47X014747

025 Typ: B 640 Typ: A174 Typ: B 747,2347 Typ: A 14747
kommt ^^ => d.h.
(1. Doppelkomma => verschwindet ganz,
Komma nach der 25 ist auch weg
aus X01 wird aber die 1 dennoch übernommen
Komma verschwindet, usw.) - aber das ist ja nicht richtig!

Ich hab zwar jetzt an so vielen Stellen herumgeschraubt und verbessert,
aber es will nicht komplett gelingen.

Sieht vielleicht einer von Euch, woran es liegt?
oder gibt es am Ende eine komplett einfachere Lösung? (ich habe keine Informatikerausbildung und Algorithmenentwicklung nicht nativ gelernt)

Vielen Dank.
Jan
Allen demnächst ein gutes 2023!

Geändert von JanWe (19. Dez 2016 um 23:45 Uhr)
  Mit Zitat antworten Zitat