TStringList und Stringvergleich

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

TStringList und Stringvergleich

Beitrag von RuhrPotto »

Ich hab glaub ich mal wieder ein Brett vorm Kopf und folgendes Problem:

In der ersten Zeile einer Stringlist wird folgender Eintrag gespeichert:

Code: Alles auswählen

 
const
  cFileKenn = '#Kategorien';   
::
slKatData.Add(cFileKenn);   //1. Zeile in Datei
::
slKatData.SaveToFile(fnKatFile)
 

Die Datei auf der Platte sieht vollkommen OK aus
Beim Einlesen erfolgt ein Vergleich ob die Kennung passt

Code: Alles auswählen

 
::
slKatData.LoadFromFile(fnKatFile);
::
if slKatData.Strings[0] <> cFileKenn then --> Fehlerroutine
 


Im Memo mit Fehlerhinweisen steht dann >#Kategorien< ungleich >#Kategorien< !? :?:

Kann mir jemand sagen, woher das Brett kommt ..
Jeder macht Fehler - viele Fehler brauchen EDV!

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: TStringList und Stringvergleich

Beitrag von wp_xyz »

Ich weiß nicht, was du sonst noch in die Stringlist geschrieben hast, oder ob die Datei evtl aus einer anderen Anwendung stammt. Jedenfalls habe ich das Gefühl, dass die Datei vielleicht einen BOM (Byte-order-marker) enthält, der beim Lesen der 1.Zeile zugeschlagen wird. Öffne die Datei mal mit Notepad++; in der Statuszeile rechts unten würde dann "UTF8 BOM" stehen. Suche hier im Forum nach "BOM" - einen ähnlichen Fall hatten wir vor nicht zu langer Zeit schon mal; du findest da, wie du die Daten ohne BOM lesen kannst.

RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Re: TStringList und Stringvergleich

Beitrag von RuhrPotto »

Danke für die schnelle Rückmeldung und den Hinweis!

Das war das Brett!
Und meinen Kumpel werd ich hauen; der hat die erstellte Datei tatsächlich mit dem Windows-Editor geöffnet und bearbeitet worduch die Kodierung geändert wurde. :(

Hat schon mal jemand versucht, den BOM abzufragen und ggfs. zu entfernen?
Ansonsten werd ich es mal versuchen

Danke!
Jeder macht Fehler - viele Fehler brauchen EDV!

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

Re: TStringList und Stringvergleich

Beitrag von theo »

RuhrPotto hat geschrieben:Hat schon mal jemand versucht, den BOM abzufragen und ggfs. zu entfernen?
Ansonsten werd ich es mal versuchen


Geht im Zweifel immer noch mit TCharEncStream (http://wiki.freepascal.org/UTF8_Tools)

Code: Alles auswählen

 
f := TCharEncStream.Create;
f.LoadFromFile(OpenDialog1.FileName);
slKatData.Text := f.UTF8Text
f.Free;

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: TStringList und Stringvergleich

Beitrag von wp_xyz »

Dafür war der Hinweis mit der Suche im Forum gedacht...

Aber egal. Am wenigsten Schreibarbeit hat man mit den Routinen GuessEncoding und ConvertEncoding aus LazUTF8 und LConvEncoding; man kann damit auch gleich ANSI-Dateien erledigen (zumindest solange keine fremde Code-Seite vorliegt):

Code: Alles auswählen

uses
  lconvencoding, lazutf8;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  stream: TStream;
begin
  stream := TFileStream.Create(Dateiname, fmOpenRead);
  try
    SetLength(s, stream.Size);
    stream.ReadBuffer(s[1], stream.Size);
    s := ConvertEncoding(s, GuessEncoding(s), encodingUtf8);
    Memo1.Lines.Text := s;
  finally
    stream.free;
  end;
end;

RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Re: TStringList und Stringvergleich

Beitrag von RuhrPotto »

War heute leider lange Off und hab mir selber auch noch ne Lösung überlegt.
Bisher funktioniert sie unter dem Ansatz, dass das Problem die drei Zeichen der BOM-Kennung sind.
Die Dateien können sowohl "richtig" als auch nach Speicherung mit BOM-Präfix durch den Windows-Editor gelesen und verarbeitet werden:

Code: Alles auswählen

 
  function DoStringToHexStr(const sToHex:string):string;
  begin
     SetLength(Result, Length(sToHex)*2);
     if Length(sToHex) > 0 then
        BinToHex(PChar(sToHex), PChar(Result), Length(sToHex));
    end;
 
//Prüfung auf BOM-Präfix und ggfs. entfernen desselben 
function CheckBOM(var sCheck:string):boolean;
 const
    cBOM = 'EFBBBF';
 var
    wfS : string;
      Check : string;
 begin
    result := false;
    wfS := Copy(sCheck,1,3);
    Check := DoStringToHexStr(wfS);
    if Check = cBOM then
        begin
          result := true;
          sCheck := Copy(sCheck,4,Length(sCheck)-3);
        end;
end;   
 
//Aufruf
wfS := slKatData.Strings[0];
if CheckBOM(wfS) then mKatInfo.Lines.Add('>> Falscher Dateityp geändert');
if wfS <> '#Kategorien' then
    begin
      FehlerMsg(5,'Falsche Daten: >'+ slKatData[0] +'< ungleich Kennung >'+cFileKenn+'<');
      slKatData.Free;
      EXIT;
end
 
 
Jeder macht Fehler - viele Fehler brauchen EDV!

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TStringList und Stringvergleich

Beitrag von Soner »

Das Problem hatte ich auch. Ich habe es so gelöst, dass ich vor dem Speichern in die String-Liste am Anfang eine Zeile hinzugefügt und nach dem Laden erst Zeile gelöscht habe.

Antworten