Probleme mit Stringlist->DelimitedText



  • Hallo allerseits!

    Ich bastele gerade mit TStringList herum. Ich lese dazu aus einer INI Strings aus, die ungefähr wie folgt aussehen:

    job_2=4;Clean;;1;05.05.2004 13:28:00;1;0;0;;0

    Wie man sehen kann, sind darin einzelne Teilstrings durch ";" getrennt. Ich versuche nun mit dem folgenden Code die Teilstrings auszulesen:

    TStringList *slJobParams;
    slJobParams = new TStringList();
    slJobParams->Delimiter = ';';
    
    for (int i=0; i<iJobCount; i++)
    {
        slJobParams->Clear();
        slJobParams->DelimitedText = IniFile->ReadString("jobs", "job_"+IntToStr(i+1), "");
    
        Job = new TJobObject(this);
    
        Job->iId       = i+1; // Job-Id
        Job->iJobType  = slJobParams->Strings[0].ToIntDef(-1);
        Job->sJobName  = slJobParams->Strings[1];
        Job->sFile     = slJobParams->Strings[2];
        Job->iJobCycle = slJobParams->Strings[3].ToIntDef(0);
        Job->dtNextJobExecuteTime = StrToDateTime(slJobParams->Strings[4]);
        Job->bExecuted = (slJobParams->Strings[5].ToIntDef(-1) == 0) ? false : true;
        Job->iJobExecuteDay = slJobParams->Strings[6].ToIntDef(0);
        Job->iDBDumpMode = slJobParams->Strings[7].ToIntDef(0);
        Job->sParam      = slJobParams->Strings[8];
        Job->iCleanup    = slJobParams->Strings[9].ToIntDef(0);
        JobListeWork->Add(Job);
    }
    

    Das Problem ist nun, dass in der INI Strings drinstehen, die Leerzeichen enthalten (z.B.: 05.05.2004 13:28:00). TStringlist trennt an diesen Stellen den Teilstring auf, als ob dort ein ";" stehen würde und das Auslesen des Teilstrings klappt nicht mehr. Hat jemand einen Vorschlag wie man das unterdrücken könnte?



  • Das ist eine Eigenheit, die auch schon bei CommaText auftrat/auftritt. Da hilft nur, die Teilstrings jeweils in Anführungszeichen einzupacken.
    Alternativ kannst du dir auch mal ExtractStrings() ansehen. Allerdings werden leere (Teil)Strings hier ignoriert, und deine Daten scheinen ja solche Leer-Strings zu enthalten (;;).



  • Hab sowas ähnliches umgangen, indem ich Leerzeichen vorher im String immer durch ein anderes Zeichen ersetzt habe.

    inp = StringReplace(inp," ","\"",TReplaceFlags() << rfReplaceAll);
    

    Und dann nachdem der String zerlegt ist, wieder Zeichen mit Leerzeichen ersetzen.

    Zwar nicht schön, aber ...



  • Yo. danke Euch beiden. Ich ersetze jetzt mit StringReplace alle " " durch "#EMPTY#". 👍


Anmelden zum Antworten