tstringlist

Für Fragen von Einsteigern und Programmieranfängern...
hbr
Beiträge: 325
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

tstringlist

Beitrag von hbr »

Hallo Forum,
ich habe folgendes Problem.
Ich lese eine CSV Datei mit folgender Funktion ein.

Code: Alles auswählen

 begin
   slFile := TStringList.Create;
   slRow := TStringList.Create;
   slRow.Delimiter := ';';
   slRow.QuoteChar := '"';
   try
     slFile.LoadFromFile(sFile);
     for i := 0 to slFile.Count - 1 do
     begin
       slRow.DelimitedText := slFile[i];
         if StrToInt(Format('%3d',[i,  slRow[i]])) > 0 Then
          Begin
           SatzN := slRow.Strings[0]  + ' ' + slRow.Strings[1];
           SatzD := slRow.Strings[2];
           CSVInfoFeld := slRow.Strings[3];
           if DatenBerechnung(SatzD,SatzN) Then
             Datenuebertragen;
          end;
        end;
   finally
     slFile.Free;
     slRow.Free;
   end;               
ist aber nun ein Umlaut im File enthalten, dann stürzt mein Programm ab.

Was muss ich (wo) einbauen um eine Konvertierung vor zu nehmen.

MFG
hbr.
Zuletzt geändert von Lori am Di 2. Apr 2013, 11:02, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter verwenden!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: tstringlist

Beitrag von Socke »

hbr hat geschrieben:ist aber nun ein Umlaut im File enthalten, dann stürzt mein Programm ab.

Was muss ich (wo) einbauen um eine Konvertierung vor zu nehmen.
Könntest du die Datei zur Fehlersuche bereitstellen? Ein Umlaut in der Datei sollte dein Programm nicht zum Absturz bringen.

Sollte aber der Dateiname einen Umlaut enthalten, musst du diesen konvertieren. Falls dein Dateiname in UTF-8 vorliegt, kannst du die Funktion UTF8ToSys() aus der Unit FileUtil verwenden.

Code: Alles auswählen

slFile.LoadFromFile(UTF8ToSys(sFile));
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

hbr
Beiträge: 325
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: tstringlist

Beitrag von hbr »

Hallo Socke, Danke für deine Mühe,
die Umlaute werden nicht konvertiert!
z.B. bei einem Namen Rüdiger sieht das beim debuggen so aus 'R#252'diger

Der Fehler liegt aber wo anders.
Die Fehlermeldung lautet 'EStringListError.. Listindex (5) out of bounds'.
Der geht immer nur bis maximal 5 Einträge obwohl die CSV viel mehr hat.
Die csv besteht nur aus zwei Namen einem Datum und einem Komentar.

Ich mach das ganze jetzt über normale Strings und AssignFile(f, da weiß ich auch das es Funktioniert.

Übrigens bei Windows.
Sobald ich Opendialoge im Programm verwende hängt der Debugger, ist das normal?
Fehlermeldung:
The GDB command:
"-file-exec-and-symbols "
did not return any result.

Gruß
hbr

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

Re: tstringlist

Beitrag von theo »

Ist ja auch merkwürdig dein Code.

Du iterierst durch slFile und wendest dann i auf slRow an?

Code: Alles auswählen

 
     for i := 0 to [color=#FF0000]slFile.Count[/color] - 1 do
     begin
         ..
         if StrToInt(Format('%3d',[i,  [color=#FF0000]slRow[i]][/color])) > 0 Then
 
Habe jetzt nicht alles durchdacht, aber das ist auf den ersten Blick schon sehr verdächtig.

hbr
Beiträge: 325
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: tstringlist

Beitrag von hbr »

theo hat geschrieben:Ist ja auch merkwürdig dein Code.
Du iterierst durch slFile und wendest dann i auf slRow an?
Ja, Recht hast Du!

Hab jetzt noch mal was geändert und jetzt Funktioniert es wenigsten mit dem Einlesen.
Aber die Umlaute werden troz (UTF8ToSys(sFile)) nicht konvertiert.

Hier die Änderung!

Code: Alles auswählen

 for i := 0 to slFile.Count - 1 do
      Begin
       slRow.DelimitedText := slFile[i];
        if StrToInt(Format('%3d',[i,  slRow[0]])) > 0 Then
          Begin
           SatzN := slRow.Strings[0]  + ' ' + slRow.Strings[1];
           SatzD := slRow.Strings[2];
           CSVInfoFeld := slRow.Strings[3];
          if DatenBerechnung(SatzD,SatzN) Then
             Datenuebertragen;
          end;
      end;
Vieleicht eine Idee?

Gruß
Zuletzt geändert von Lori am Di 2. Apr 2013, 11:03, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter verwenden!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: tstringlist

Beitrag von Socke »

hbr hat geschrieben:Aber die Umlaute werden troz (UTF8ToSys(sFile)) nicht konvertiert.
Wie du dir vielleicht denken kannst, konvertiert diese Funktion vom Unicode-Zeichensatz in der UTF-8-Kodierung in den System-Zeichensatz und der dazugehörigen Kodierung (sofern abweichend). Wenn du das beim öffnen der Datei angibst, hat das auch nur Auswirkungen auf den Dateinamen, aber nicht auf den Dateiinhalt.

Dazu musst du 2 Dinge wissen oder Annahmen dazu treffen. Ohne diese kann dir niemand eine sinnvolle Antwort geben.
  • Zeichensatz der Eingabe (hier: Dateiinhalt; wo kommt die Datei her?)
  • Zeichensatz der Ausgabe (Betriebssystem-Konsole, LCL-Programm, Windows-/GTK-/QT-/Mac-Programm etc.)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: tstringlist

Beitrag von theo »

Naja, anhand von 'R#252'diger kann man schon sagen, dass die Quelle in Latin1 bzw. ISO 8859-1 bzw. Windows-1252 vorliegt.

Wenn du auf einem deutschen oder englischen Windows bist, kannst du SysToUTF8 auf die Inhalte anwenden, falls das Resultat in UTF-8 vorliegen soll.
Ansonsten den Code aus LConvEncoding verwenden.

hbr
Beiträge: 325
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: tstringlist

Beitrag von hbr »

theo hat geschrieben:... kannst du SysToUTF8 auf die Inhalte anwenden, falls das Resultat in UTF-8 vorliegen soll.
Ansonsten den Code aus LConvEncoding verwenden.
OK,OK,
das sagt mir jetzt garnix.

Also ich hatte die CSV-Datei mit Exel Standard CSV-Zeichen getrennt (Windows) erstellt.
Zu dem Zeitpunkt hatte ich den Export von Lazarus nach CSV noch nicht.

Wenn ich also die Windows(CSV) in (DBF) einlese fehlen die Umlaute.
Wenn ich von Lazarus eine CSV-Datei erstelle, fehlen die Umlaute (Hüroglüpfen) in Excel.


Was kann ich nun tun, damit beide gleich sind.

Bitte Verständlich erklären, wenn geht in Bezug auf TStrings.
Danke..


Gruß

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

Re: tstringlist

Beitrag von theo »

Socke hat schon recht, du musst wissen welcher Zeichensatz in welchem Target vorhanden sein soll.
Dann können wir dir ggf sagen, wie du die Umwandlung mit Lazarus bewerkstelligen kannst.

Mögliche (wahrscheinliche) Optionen sind: ANSI ISO 8859-1, UTF-8 oder UTF-16

Code, den du in Lazarus Controls (TEdit, TMemo....) oder in den Quelltext unter Lazarus eingibst, ist in UTF.8 (Standardeinstellung)

hbr
Beiträge: 325
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: tstringlist

Beitrag von hbr »

Hallo,
ist ja alles gut und schön, aber wo stelle ich das den ein? DBGRID oder?

Wenn ich ein Entwicklungstool für die Oberfläche Windows habe, dann soll es auch den Zeichensatz von Windows benutzen!
Das ist doch wohl Voraussetzung.
Das gleiche gilt dann für Unix.
Ich bin gerade bei Windows.
Wo kann man das den einstellen?

Gruß

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: tstringlist

Beitrag von Socke »

hbr hat geschrieben:Wo kann man das den einstellen?
Gar nicht.

Die LCL (d.h. alle Komponenten, die du auf ein Formular legst) arbeiten mit UTF-8. Das ist eine Design-Entscheidung der Entwickler. Die RTL arbeitet grundsätzlich mit dem Systemzeichensatz. Wenn du also eine Datei bearbeitest, arbeitest du mit der RTL und verwendest den Systemzeichensatz. Zeigst du Daten auf einem Formular an, müssen diese in UTF-8 kodiert sein, um korrekt dargestellt zu werden.

Davon unabhängig ist der Zeichensatz, den Lazarus für die Quelltext-Dateien verwendet.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

hbr
Beiträge: 325
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: tstringlist

Beitrag von hbr »

Socke hat geschrieben:
hbr hat geschrieben:Wo kann man das den einstellen?
Gar nicht.
Super,
dass heißt es geht nicht?

Gruß

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

Re: tstringlist

Beitrag von theo »

hbr hat geschrieben: dass heißt es geht nicht?
Wie schon mehrfach gesagt: Es heißt, dass man beim Laden und Speichern umwandeln muss.
Dazu muss man aber wissen, was jew. erwartet wird.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: tstringlist

Beitrag von mse »

hbr hat geschrieben: Super,
dass heißt es geht nicht?
MSEide+MSEgui?
@Theo: Einmal pro Jahr erlaubt, OK?

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

Re: tstringlist

Beitrag von theo »

mse hat geschrieben: @Theo: Einmal pro Jahr erlaubt, OK?
Ich finde nicht. Es trägt nichts zur Problemlösung unter Lazarus bei und nur darum geht es hier.
Platziere die Werbung für dein Tool bitte anderswo.

Antworten