Textdatei suchen und Wert speichern

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Textdatei suchen und Wert speichern

Beitrag von theo »

mschnell hat geschrieben: Unsinn. Dann könnte man nicht MyShortString := MyString schreiben.
Abgesehen davon, dass dieser Einwand direkt nichts mit Unicode zu tun hat, wüsste ich nicht warum man das dann nicht schreiben könnte.
Es ist doch dem Compiler seine Sache wie er das macht.
Aber hör bitte jetzt auf. Wir sollten diesen Thread nicht noch weiter zumüllen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Textdatei suchen und Wert speichern

Beitrag von mschnell »

Für diese abschließende Klarstellung fange ich jetzt keinen neuen Thread an !

Aus dem englischen FPC-Developer Forum auf meine Frage wie ein späterer Delphi-kompatibler FPC mit 16-Bit Unicode-Strings mit Shortstrings umgeht:

On Fri, August 31, 2012 16:22, Michael Schnell wrote:
> On 08/31/2012 03:21 PM, Tomas Hajny wrote:
>> Type ShortString stays unchanged (locale specific 8-bit character set).
>>
> Thus there will be auto-conversion when doing MyShortString := MyString; ?

Yes, this auto-conversion already exists now.

Tomas

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Textdatei suchen und Wert speichern

Beitrag von theo »

Na und? Die gibt's auch auf AnsiString.
Was ändert das an den Fakten? ShortString bleibt Unicode-agnostisch.

Mir persönlich gehen diese "auto-conversions" übrigens mächtig auf den Keks.

klaus2012
Beiträge: 6
Registriert: Fr 31. Aug 2012, 06:45

Re: Textdatei suchen und Wert speichern

Beitrag von klaus2012 »

Danke erstmal an alle, auch wenn es in vielen Beiträgen nicht ganz um das Problem geht...

@indianer-frank
habe gestern mal ein wenig gegrübelt und habe gesehen das Position nicht gleich Inhalt ist.
Ich habe zuerst versucht den Wert mit val zu speichern. Leider erwartet val einen String und kein real.
Mit deiner Methode e[f] kam ich immer zu dem Fehler Error: Incompatible types: got "Real" expected "Byte"

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Textdatei suchen und Wert speichern

Beitrag von indianer-frank »

klaus2012 hat geschrieben:@indianer-frank
habe gestern mal ein wenig gegrübelt und habe gesehen das Position nicht gleich Inhalt ist.
Ich habe zuerst versucht den Wert mit val zu speichern. Leider erwartet val einen String und kein real.
Mit deiner Methode e[f] kam ich immer zu dem Fehler Error: Incompatible types: got "Real" expected "Byte"
Richtig. Im allgemeinen ist eine Position ja auch ein Byte, Word etc und kein Real. Also versuch es mal mit:

Code: Alles auswählen

var
  e: string;
  f: byte;
  p: array[1..49] of real;
  c: char;
  i: integer;
begin
  e := 'P35,5 P36,6';
  f := pos('P35',e)+4;  {f -> 'P', .. f+3 -> ',' f+4 -> '5'}
  c := e[f];
  val(c,p[35],i);
  writeln(p[35]);
end.
Dies ist aber nur ein lauffähiges Minimal-Beispiel für den Fall, daß die Parameter einstellige Zahlen sind. Ansonsten müßte man allgemeinere Zahlen besser separieren (wobei zB geklärt sein muß, ob auch Realzahlen vorkommen können, Dezimal- und Tausender-Trennzeichen, Vorzeichen, Exponenten etc beachten). Wenn das der Fall ist, solltest Du vielleicht besser die vorgeschlagenen fertigen Units verwenden.

klaus2012
Beiträge: 6
Registriert: Fr 31. Aug 2012, 06:45

Re: Textdatei suchen und Wert speichern

Beitrag von klaus2012 »

Danke, das hat mir erstmal zum Verstehen geholfen. Jetzt habe ich natürlich das Problem das
nicht nur Ganzzahlen, sondern auch Real sowie positive und negative Zahlen vorkommen können.
Deshalb saß ich gestern noch einige Zeit und habe versucht dies abzufangen:

Code: Alles auswählen

while (e[f]in['.','-','+','0'..'9'])and(f<=length(e)) do begin
                                                           w:=w+e[f];
                                                           f:=f+1;
                                                           end;
Nur leider liest er dieses mal garnichts ein.

Auch ein Versuch mit dem Tool csvdocument bin ich sehr überfragt, da mich die Vielzahl an Prozeduren erschlägt.

Ich dachte es geht einfacher diese Werte nach den Parametern einzulesen und zu speichern.
Zuletzt geändert von Lori am Di 4. Sep 2012, 17:19, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

klaus2012
Beiträge: 6
Registriert: Fr 31. Aug 2012, 06:45

Re: Textdatei suchen und Wert speichern

Beitrag von klaus2012 »

Hier nochmal der komplette Code:

Code: Alles auswählen

c        : char;
e       :  string[125];
ff       : byte; 
ii       : integer; 
p        : array[1..49] of real;
 
 
                       if pos('P35',e)>0 then begin
                       writeln(fo,'!!!!!!! HIER habe ich den Parameter P35 gefunden !!!!!!!!');
                       ff:=pos('P35',e)+4;
                       c := e[ff];
                       while (e[ff]in['.','-','+','0'..'9'])and(ii<=length(e)) do begin
                                                           c:=c+e[ff];
                                                           ii:=ii+1;
                                                           end;
                       val(c,p[35],ii);
 
                       writeln(fo,'Wert des Parameters P35: ',p[35]:9:3);
                       end;
Fehler ist jetzt hier bei

Code: Alles auswählen

c:=c+e[ff]
C:\Users\herbben\Desktop\DF3\ZDF3.PAS(81,64) Error: Incompatible types: got "ShortString" expected "Char"
Zuletzt geändert von Lori am Di 4. Sep 2012, 17:20, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter nutzen

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Textdatei suchen und Wert speichern

Beitrag von indianer-frank »

klaus2012 hat geschrieben:

Code: Alles auswählen

c        : char;
e       :  string[125];
ff       : byte; 
ii       : integer; 
...
   while (e[ff]in['.','-','+','0'..'9'])and(ii<=length(e)) do begin
      c:=c+e[ff];
      ii:=ii+1;
   end
Fehler ist jetzt hier bei

Code: Alles auswählen

c:=c+e[ff]
C:\Users\herbben\Desktop\DF3\ZDF3.PAS(81,64) Error: Incompatible types: got "ShortString" expected "Char"
Ich hege langsam den Verdacht, daß Du noch ein ziemlicher Anfänger bist und Dich zumindest erstmal in die Datentypen von Pascal einarbeiten mußt. Weiter solltest Du auf die Fehlermeldungen des Compilers achten: Wenn er einen String haben will, gibt ihm doch einen. Was soll Deiner Meinung nach denn die Anweisung c:=c+e[ff] bewirken, wenn c als einzelnes Zeichen deklariert ist? Die MIndeständerung ist also die Deklaration var c: string;.

Es sind aber noch mehr Fehler vorhanden: zB liest Du ja immer das gleiche Zeichen aus Deinen Eingabestring etc. Korrigiere erst einmal diese beiden und beurteile das Ergebnis.

klaus2012
Beiträge: 6
Registriert: Fr 31. Aug 2012, 06:45

Re: Textdatei suchen und Wert speichern

Beitrag von klaus2012 »

ja da hast du Recht, Programmieren ist nicht mein Steckenpferd, komme aber gerade nicht daran vorbei.
Daher bitte ich ja hier um ein wenig Hilfe. Danke im übrigen für die Tipps.

Code wurde abgeändert und sieht wie folgt aus:

Code: Alles auswählen

c        : string;
e       :  string[125];
ff       : byte; 
ii       : integer; 
p        : array[1..49] of real;
 
if pos('P35',e)>0 then begin
                       writeln(fo,'!!!!!!! HIER habe ich den Parameter P35 gefunden !!!!!!!!');
                       ff:=pos('P35',e)+4;
                       {c := e[ff];}
                       while (e[ff]in['.','-','+','0'..'9'])and(ii<=length(e)) do begin
                                                           c:=c+e[ff];
                                                           ii:=ii+1;
                                                           ff:=pos('P35',e)+4+ii;
                                                           end;
                       val(c,p[35],ii);
                       writeln(fo,'Wert des Parameters P35: ',p[35]:9:3);
                       end;
Bei folgenden Inputs kommt es zu folgender Ausgabe:

Input:

Code: Alles auswählen

P35,5
Output:

Code: Alles auswählen

P35=5
Das passt soweit.

Input:

Code: Alles auswählen

P35,72.22
 
Output:

Code: Alles auswählen

P35=572.22
Hier gibt er das erste Zeichen noch von dem letzten Wert aus. Das muss ich denke in der While Schleife noch ändern. 

Input:

Code: Alles auswählen

P35,0
 
Output:

Code: Alles auswählen

P35=0.000
Wie kann ich aber die Minuszeichen mitnehmen ? Hoffe du hast noch einen guten Ratschlag... :oops:
Zuletzt geändert von Lori am Di 4. Sep 2012, 17:21, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter nutzen!

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Textdatei suchen und Wert speichern

Beitrag von indianer-frank »

Jetzt hast Du einen Fehler beseitigt, aber dadurch einen neuen eingebaut: c := e[ff] vor der Schleife war falsch, wenn Du die Anweisung aber einfach streichst, ist c nicht initialisiert. Außerdem brauchst Du in der Schleife das ii nicht und solltest nur mit ff weiterarbeiten:

Code: Alles auswählen

var
  c  : string;
  e  : string[125];
  ff : byte;
  ii : integer;
  p  : array[1..49] of real;
begin
  e := 'P35,-56.7 P36,6';
  if pos('P35',e)>0 then begin
    writeln(fo,'!!!!!!! HIER habe ich den Parameter P35 gefunden !!!!!!!!');
    ff:=pos('P35',e)+4;
    c := '';
    while (e[ff] in ['.','-','+','0'..'9']) and (ff<=length(e)) do begin
      c  := c+e[ff];
      ff := ff+1;
    end;
    val(c,p[35],ii);
    writeln(fo,'Wert des Parameters P35: ',p[35]:9:3);
  end;
end;
Das Stück ergibt dann zumindest bei mir

Code: Alles auswählen

!!!!!!! HIER habe ich den Parameter P35 gefunden !!!!!!!!
Wert des Parameters P35:   -56.700
Soweit das Grundgerüst. Es können allerdings immer noch Probleme auftauchen: ZB wenn die Eingabe 'P35,-5.6.7 P36,6' ist, erhältst Du 0 als Ausgabe. Diese Situation kann man erkennnen, wenn bei der Umwandlung val(c,p[35],ii) ein Fehlercode ii<>0 geliefert wird.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Textdatei suchen und Wert speichern

Beitrag von creed steiger »

Wie ist das Textfile den letztendlich aufgebaut?

P35,4.55 P36,5335 P37,-1.000 ...?

oder P35,4.55,P36,5335,P37,-1.000,.....

im ersten Fall würde ich nach den Leerzeichen suchen und einfach in "linksvomkomma" und "rechstvomkomma" trennen

im zweiten Fall ist es mit csvdocuments schnell erledigt (delimiter setzen,loadfromfile und dann auf die cells zugreifen)

Oder sind deine Werte irgendwie wild verstreut,dann würde ich es fast mit regex probieren (auch wenn da mancher schimpfen wird;))

klaus2012
Beiträge: 6
Registriert: Fr 31. Aug 2012, 06:45

Re: Textdatei suchen und Wert speichern

Beitrag von klaus2012 »

Dank Indianer-frank haut das jetzt hin...

Nochmals dank an alle...

Antworten