![]() |
[Linux] String teilen - Trenner Leerzeichen - Anzahl nicht gleich
Nach über 3 Jahren Pause bin ich wieder zurück beim Coden. Nun nutze ich Lazarus 0.2.29 auf meiner Linux Distribution und komm nach langem Suchen hier im Forum nicht zum Nenner.
Mein Problem ist wie folgt: Ich hab eine List wie zum Beispiel
Code:
Die Ausgabe soll wie folgt sein:
la Laos
latam Latin American lt Lithuania lv Latvia mao Maori
Code:
In CPP ist es wie folgt gelöst:
Laos (la)
Latin America (latam) Lithuania (lt) Latvia (lv) Maori (mao)
Code:
Die Ausgabe von xkeyboard-layouts ist wie in der ersten Code-Box.
QStringList Backend::keyLayouts()
{ QStringList _layouts; QString code, desc, line; Process p(QStringList() << "xkeyboard-layouts"); if (p.waitForFinished()) { while (p.canReadLine()) { line = p.readLine(); code = line; code.truncate(line.indexOf(" ")); desc = line.remove(0, line.indexOf(" ")); _layouts.append(desc.simplified() + " - (" + code.simplified() + ")"); } } return _layouts; } Ich werd nun weiter Suche ... |
AW: [Linux] String teilen - Trenner Leerzeichen - Anzahl nicht gleich
Delphi-Quellcode:
//Function ProccessAndWait
procedure Processandwait(Executable : String); var AProcess1: TProcess; AStringList: TStringList; AMemo: TMemo; Result : String; i : integer; begin AStringList := TStringList.Create; AMemo := TMemo.Create(Form1); Result:=' '; try AProcess1 := TProcess.Create(nil); AProcess1.CommandLine := Executable; AProcess1.Options := AProcess1.Options+ [poUsePipes]; {Execute} AProcess1.Execute; {Wait to finish} while AProcess1.running = true do begin AStringList.LoadFromStream(AProcess1.Output); AMemo.lines.add(Astringlist.text); end; finally // Fill Keyboard Models if Processcmd = 'xkeyboard-models' then begin for i := 0 to AMemo.Lines.Count - 1 do if AMemo.lines[i] = '' then // do nothing else Form1.Page2Combobox.items.add(AMemo.lines[i]); end; // Fill Keyboard Layouts if Processcmd = 'xkeyboard-layouts' then begin for i := 0 to AMemo.Lines.Count - 1 do if AMemo.lines[i] = '' then // do nothing else begin Form1.Page2Layoutlist.items.add(Delete(AMemo.lines[i], 1, Pos('', AMemo.lines[i]))); end; end; //Clean up; AProcess1.Free; AStringlist.Free; AMemo.Free; end; end;
Code:
... funktioniert nicht um zum Beispiel (siehe weiter unten) cd zu bekommen.
Form1.Page2Layoutlist.items.add(Delete(AMemo.lines[i], 1, Pos('', AMemo.lines[i])));
Code:
... liefert mir zum Beispiel:
Form1.Page2Layoutlist.items.add(AMemo.lines[i]);
Code:
Steh noch immer auf dem Schlauch um:
cd Congo, Democratic Republic of the
Code:
Ich müsste cd rausfiltern, was aber auch mal nec_vndr/jp
Congo, Democratic Republic of the (cd)
Code:
sein kann, und Democratic Republic of the finden wobei es unterschiedliche Anzahlen von Leerzeichen pro Zeile geben kann. Verzwickt das zu lösen, wenn man so lang aus dem Coden raus ist ...
nec_vndr/jp Japan (PC-98xx Series)
|
AW: [Linux] String teilen - Trenner Leerzeichen - Anzahl nicht gleich
Hallo Amnon82,
worüber genau stolperst Du? Wenn ich das richtig verstanden habe, dann hast Du mehrere Zeilen Text. Jede Textzeile ist so aufgebaut, daß an der Stelle 1..n ein Code/Wort steht, der/das kein Leerzeichen enthält. An der Stelle n+1 folgt mindestens ein Leerzeichen. An der Stelle n+1+x folgt weiterer Text (Langtext zum vorhergehenden Code) also sollte so etwas funktionieren:
Delphi-Quellcode:
Gruß
pp:=pos(' ',Zeile);
codewort:=copy(Zeile,1,pp-1); Langtext:=trimmleft(copy(Zeile,pp+1,length(zeile)-pp); Zeile:=Langtext+'('+Codewort+')'; K-H |
AW: [Linux] String teilen - Trenner Leerzeichen - Anzahl nicht gleich
Danke für den Tip. Ich hab noch ein bisschen weiter gesucht und folgendes zusammengeschrieben, was mir die Lösung bringt:
Delphi-Quellcode:
Ergebnis ist nun wie folgt:
procedure Processandwait(Executable : String);
var AProcess1: TProcess; AStringList: TStringList; AMemo: TMemo; Result, AString1, AString2 : String; i : integer; begin AStringList := TStringList.Create; AMemo := TMemo.Create(Form1); Result:=' '; try AProcess1 := TProcess.Create(nil); AProcess1.CommandLine := Executable; AProcess1.Options := AProcess1.Options+ [poUsePipes]; {Execute} AProcess1.Execute; {Wait to finish} while AProcess1.running = true do begin AStringList.LoadFromStream(AProcess1.Output); AMemo.lines.add(Astringlist.text); end; finally // Fill Keyboard Models if Processcmd = 'xkeyboard-models' then begin for i := 0 to AMemo.Lines.Count - 1 do if AMemo.lines[i] = '' then // do nothing else Form1.Page2Combobox.items.add(AMemo.lines[i]); end; // Fill Keyboard Layouts if Processcmd = 'xkeyboard-layouts' then begin for i := 0 to AMemo.Lines.Count - 1 do if AMemo.lines[i] = '' then // do nothing else begin Astring1:=copy(AMemo.lines[i],0,pos(' ',AMemo.lines[i])-1); AString2:=copy(AMemo.lines[i],pos(' ',AMemo.lines[i])+1,length(AMemo.lines[i])); Form1.Page2Layoutlist.items.add(trim(Astring2) + ' (' + Astring1 + ')'); end; end; //Clean up; AProcess1.Free; AStringlist.Free; AMemo.Free; end; end; ![]() Nächste Aufgabe ist aus:
Code:
uz: finden und folgende Ausgabe hinzubekommen:
crh uz: Crimean Tatar (Turkish Q)
crh_f uz: Crimean Tatar (Turkish F) crh_alt uz: Crimean Tatar (Turkish Alt-Q) kr104 kr: 101/104 key Compatible
Code:
Crimean Tatar (Turkish F) [crh_f]
Crimean Tatar (Turkish Alt-Q) [crh_alt] |
AW: [Linux] String teilen - Trenner Leerzeichen - Anzahl nicht gleich
Ist doch genau das gleiche Strickmuster.
Hauptsache das erste Blank ist auch wirklich der Trenner. Gruß K-H |
AW: [Linux] String teilen - Trenner Leerzeichen - Anzahl nicht gleich
Ok Ich hab nun folgenden Code zusammengebaut:
Delphi-Quellcode:
Den ich wie folgt aufrufe:
// Fill Keyboard Variants
if Processcmd = 'xkeyboard-variants' then begin Form1.Page2Variantlist.clear; Form1.Page2Variantlist.items.add('[None]'); for i := 0 to AMemo.Lines.Count - 1 do if AMemo.lines[i] = '' then // do nothing else if pos(Processvar,AMemo.lines[i]) <> 0 then begin Astring1:=copy(AMemo.lines[i],0,pos(' ',AMemo.lines[i])-1); AString2:=copy(AMemo.lines[i],pos(' ',AMemo.lines[i])+1,length(AMemo.lines[i])); AString2:=StringReplace(AString2,Processvar+' ','',[rfReplaceAll]); Form1.Page2Variantlist.items.add(trim(Astring2) + ' [' + Astring1 + ']'); end; end;
Delphi-Quellcode:
Es funktioniert zwar aber es dauert ewig bis die Anzeige da ist. Die Liste die er durchgeht ist ca. 350 Zeilen lang. Es währe besser die Liste schon zu haben und nur diese durchzugehen. Mal sehen wie ich das hinbekommen. Ich denk ich hab schon was im Kopf ...
procedure TForm1.Page2LayoutListClick(Sender: TObject);
begin //Fill Keyboard Variants Processcmd:='xkeyboard-variants'; Processvar:= Page2LayoutList.Items.Strings[Page2LayoutList.ItemIndex]; Processvar:= copy(Processvar,pos('[',Processvar)+1,length(Processvar)); Processvar:= StringReplace(Processvar,']',':',[rfReplaceAll]); Processandwait(Processcmd); end; |
AW: [Linux] String teilen - Trenner Leerzeichen - Anzahl nicht gleich
Wenn ich das richtig sehe, dann liegen Deine Rohdaten irgendwo auf dem form. Wie wäre es sie in einer Stringlist oder in Strings, unter zu bringen; das ist in der Verarbeiung um einiges schneller.
Gruß K-H |
AW: [Linux] String teilen - Trenner Leerzeichen - Anzahl nicht gleich
Nun hab ichs endlich. Hier die Snippes:
Liste erstellen: Aufruf bei Programmstart
Delphi-Quellcode:
Der ganze Process
//Get Keyboard Variants
AMemoVariants := TMemo.Create(Form1); Processcmd:='xkeyboard-variants'; Processandwait(Processcmd);
Delphi-Quellcode:
Aufruf im Programm
//Function ProccessAndWait
procedure Processandwait(Executable : String); var AProcess1: TProcess; AStringList: TStringList; AMemo: TMemo; Result, AString1, AString2 : String; i : integer; begin AStringList := TStringList.Create; AMemo := TMemo.Create(Form1); Result:=' '; try AProcess1 := TProcess.Create(nil); AProcess1.CommandLine := Executable; AProcess1.Options := AProcess1.Options+ [poUsePipes]; {Execute} AProcess1.Execute; {Wait to finish} while AProcess1.running = true do begin AStringList.LoadFromStream(AProcess1.Output); // Fill Keyboard Variants if Processcmd = 'xkeyboard-variants' then begin AMemoVariants.Lines.add(Astringlist.text); end else AMemo.lines.add(Astringlist.text); end; finally // Fill Keyboard Models if Processcmd = 'xkeyboard-models' then begin for i := 0 to AMemo.Lines.Count - 1 do if AMemo.lines[i] = '' then // do nothing else Form1.Page2Combobox.items.add(AMemo.lines[i]); end; // Fill Keyboard Layouts if Processcmd = 'xkeyboard-layouts' then begin Form1.Page2Layoutlist.clear; for i := 0 to AMemo.Lines.Count - 1 do if AMemo.lines[i] = '' then // do nothing else begin Astring1:=copy(AMemo.lines[i],0,pos(' ',AMemo.lines[i])-1); AString2:=copy(AMemo.lines[i],pos(' ',AMemo.lines[i])+1,length(AMemo.lines[i])); Form1.Page2Layoutlist.items.add(trim(Astring2) + ' [' + Astring1 + ']'); end; end; //Clean up; AProcess1.Free; AStringlist.Free; AMemo.Free; end; end;
Delphi-Quellcode:
procedure TForm1.Page2LayoutListClick(Sender: TObject);
var AString1, AString2 : String; i : Integer; begin //Fill Keyboard Variants Processvar:= Page2LayoutList.Items.Strings[Page2LayoutList.ItemIndex]; Processvar:= copy(Processvar,pos('[',Processvar)+1,length(Processvar)); Processvar:= StringReplace(Processvar,']',':',[rfReplaceAll]); Form1.Page2Variantlist.clear; Form1.Page2Variantlist.items.add('[None]'); for i := 0 to AMemoVariants.Lines.Count - 1 do if AMemoVariants.lines[i] = '' then // do nothing else if pos(Processvar,AMemoVariants.lines[i]) <> 0 then begin Astring1:=copy(AMemoVariants.lines[i],0,pos(' ',AMemoVariants.lines[i])-1); AString2:=copy(AMemoVariants.lines[i],pos(' ',AMemoVariants.lines[i])+1,length(AMemoVariants.lines[i])); AString2:=StringReplace(AString2,Processvar+' ','',[rfReplaceAll]); Form1.Page2Variantlist.items.add(trim(Astring2) + ' [' + Astring1 + ']'); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz