LUA: Anführungszeichen aus String entfernen?

TaranisX9d

Newbie
Registriert
Dez. 2020
Beiträge
6
Hallo, kann mir jemand in einem Beispiel zeigen wie ich Anführungszeichen in einem String entferne? Das ist sicher kein Problem ich habe mich da aber irgendwie verrannt und komme einfach nicht dahinter.
Nehmen wir an, dar String schaut so aus: 90°45'34°27'
Wie bekomme ich die ' aus dem String?
Gruß Thomas
 
Morgen Thomas!

Das was du suchst nennt sich "substitution" und sollte so klappen:

Code:
s = "90°45'34°27'"
print(s)
s=string.gsub(s, "\'", "")
print(s)

Wichtig ist das sogenannte "escapen" des einfachen Anführungszeichens. Escapen kannst du in den meisten Programmiersprachen mit einem Backslash \ . Das brauchst du, damit die Laufzeitumgebung das Anführungszeichen nicht als String-Ende oder ähnliches interpretiert.

Habe es kurz hier ausprobiert: https://www.lua.org/cgi-bin/demo

Hier findest du die Dokumentation zu String-Manipulation: http://lua-users.org/wiki/StringLibraryTutorial

Viel Erfolg weiterhin!
 
Code:
string.gsub ( "text", "zu ersetzender text", "text der eingefügt werden soll" )

1 Minute Internetsuche. Den Rest wirst Du dir aus dem Zusammenhang deiner Anwendung wohl selber drumherum bauen müssen.
Geht auch mit pregfind bzw, pregreplace. Wie steht im LUA-Wiki.
 
ich hab mir dafür folgende function geschrieben:

Code:
function RemoveStringInString(str,removestring,amount)    --pvcf
    local fullstring="";
    local _amount = 1; -- amounts of strings trying to find   
    if amount then _amount = amount; end
    local fullstring = gsub(str, removestring, " ", _amount);
    return fullstring;
end

du fütterst das ding dann so:
(ich hab mal das ' durch ein M ersetzt damits lesbar bleibt!)

local newstring = RemoveStringInString("90°45M34°27M","M", 2);

wenn du hinten die 2 reinschreibst, entfernt er halt beide M's , bei 1 nur das erste und so weiter

ps.: an die potentiellen superoptimierer: ich weiss dass man das alles unleserlich in eine Zeile bekommt, das ist nicht das Ziel).
 
  • Gefällt mir
Reaktionen: TaranisX9d
@xdave78
So geht es aber nicht, das hab ich schon 100* Versucht.

GPS=string.gsub(GPS, "\'", "")

die Variable GPS schaut in Normalfall ungefähr so aus: 90°45'34°27'

@pvcf Das werde ich gleich mal versuchen
 
Muss man das einfache Anführungszeichen wirklich escapen?
Der String wird ja durch doppelte Anführungszeichen "begrenzt".
 
Dann prüfe einmal, ob es wirklich ein einfaches Anführungszeichen oder ein Back-Tick o.ä. ist.
Das Zeichen was du in der Substitution angibst muss natürlich genau das selbe sein wie das, das im String vorkommt.
Ergänzung ()

@tollertyp Du hast Recht, man müsste es in diesem Fall nicht escapen. Aber es schadet nicht und besser ist, man hat das Escaping auf dem Schirm, als es komplett zu übersehen.
 
ich frag mich auch die ganze zeit, ob lua in einem string dieses ' überhaupt mag bzw sich nicht daran aufhängt
 
Ja, hatte gerade kurz Sorge, dass das "falsche" (unnötige) Escaping Probleme machen könnte, aber ergibt keinen Sinn.

Ein normaler Backslash muss ja als \\ angegeben werden, insofern besteht keine "Verwechslungsgefahr".
 
Ein
Code:
str= string.gsub("90°45'34°27'", "'", "")
print(str)
ergibt die Ausgabe:
90°4534°27

Getestet mit Lua 5.2.4
 
andy_m4 schrieb:
Ein
Code:
str= string.gsub("90°45'34°27'", "'", "")
print(str)
ergibt die Ausgabe:
90°4534°27

Getestet mit Lua 5.2.4
Stimmt, so geht es auch, allerdings nicht bei mir, ich weiß nicht genau in welcher Form diese Daten übergeben werden, das Problem muss ein andres sein.
Das Programm soll auf eine Taranis mit OpenTX laufen und frägt Telemetriedaten eines Rc Rovers ab, kann sein das hier eine ältere LUA Version zum Einsatz kommt oder der Strin irgenwie noch was andres hat. Alle andren Daten gehen, nur GPS nicht, weiß der Geier warum. Simuliere ich das Prog. am PC funktioniert es.
 
Lass dir den String vor der Operation einmal ausgeben und prüfe was für Zeichen die geliefert bekommst (was in der GPS Variable überhaupt drin ist). Die Substitution müsste so eigentlich funktionieren, daher muss etwas anderes falsch sein.
 
Ich habe das Script so einfach wie möglich gehalten, es funktioniert auch alles bis auf die Ausgabe des Wertes GPS der Wert kommt so an wie auf dem 1 Bild 2. Zeile von unten. Das Script sringt an (Bild2) aber sobald der Rover ein GPS Signal empfängt steig es aus, Bild3.

Hier ist das Script im Ganzen es ist so einfach wie möglich gehalten, vllt. hat jemand eine Idee, die andren Werte kann ich einfach übernehmen und auch ausgeben lassen, nur das mit dem GPS Wert klappt einfach nicht.


local function run(event)
POSITION=getValue("GPS")
RQly=getValue("RQly")
TQly=getValue("TQly")
RSNR=getValue("RSNR")
TSNR=getValue("TSNR")
TRSS=getValue("TRSS")
GSpd=getValue("GSpd")
Sats=getValue("Sats")
Sendeleistung=getValue("TPWR")
Current=getValue("Curr")
Qual=getValue("RFMD")
if Qual==2 then Qual=150 end
if Qual==1 then Qual=50 end
if Qual==0 then Qual=4 end
Strom=getValue("Curr")
Batterie=getValue("RxBt")
if Batterie>3.0 then zell=1 end
if Batterie>4.2 then zell=2 end
if Batterie>9.2 then zell=3 end
if Batterie>13 then zell=4 end
if Batterie>16.8 then zell=5 end
if Batterie>21 then zell=6 end
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
lcd.clear()
lcd.drawText(0, 0, " Crossfire Telemetrie DF 1.0 Beta ",SMLSIZE, INVERS)
lcd.drawText(10,8, "Anz. Sateliten:",SMLSIZE)
lcd.drawText(90,8, Sats,SMSIZE)
lcd.drawText(120,8, "GPS Speed:",SMLSIZE)
lcd.drawText(180,8, GSpd,SMSIZE)
lcd.drawText(10, 16, "Signal Downl.:",SMLSIZE)
lcd.drawText(90, 16, TRSS,SMLSIZE)

lcd.drawText(120,16, "GPS:",SMLSIZE)
lcd.drawText(180,16, POSITION,SMLSIZE)

lcd.drawText(10, 24, "Quality RX: ",SMLSIZE)
lcd.drawText(90, 24, RQly,SMLSIZE)
lcd.drawText(10, 40, "Up SNR: ",SMLSIZE)
lcd.drawText(55,40,RSNR,SMSIZE)
lcd.drawGauge(70, 40, 40, 7, (RSNR), 100)
lcd.drawText(10, 32, "Quality TX: ",SMLSIZE)
lcd.drawText(90, 32, TQly,SMLSIZE)
lcd.drawText(10, 48, "Down SNR: ",SMLSIZE)
lcd.drawText(55,48,TSNR,SMSIZE)
lcd.drawGauge(70, 48, 40, 7, (TSNR), 100)
lcd.drawText(120, 24, "Volt/Zelle: ",SMLSIZE)
Batterie=Batterie*10
Batterie=math.floor(Batterie)/10
lcd.drawText(180, 24, (Batterie/zell),SMLSIZE)
lcd.drawText(120, 32, "Akku Curr.: ",SMLSIZE)
lcd.drawText(180, 32, Current,SMLSIZE)
lcd.drawText(120, 40, "Link Mode:",SMLSIZE)
lcd.drawText(180, 40, Qual.." Hz",SMLSIZE)
lcd.drawText(120, 48, "TX Leist.:",SMLSIZE)
lcd.drawText(180, 48, Sendeleistung.." mW",SMLSIZE)

end
return{run=run}
 

Anhänge

  • 1.JPG
    1.JPG
    158,9 KB · Aufrufe: 172
  • 2.JPG
    2.JPG
    207,4 KB · Aufrufe: 169
  • 3.JPG
    3.JPG
    154,5 KB · Aufrufe: 169
Also auf gut deutsch: Du hast eigentlich keine Ahnung, warum ein Fehler kommt, bist dir aber sicher, dass es die einfachen Anführungszeichen sind. Interessant.

Also wenn du sicher gehen willst, dann teste doch mal anders...
Teste einfach mal nach und nach manuell...

a) lcd.drawText(180,16, "90°45'34°27'",SMLSIZE)
b) lcd.drawText(180,16, "90°4534°27",SMLSIZE)
c) lcd.drawText(180,16, "90453427",SMLSIZE)

oder was auch immer... Finde raus, woran es liegt, und rate nichte.
 
wenn alle Stricke reißen: hast du evntl. Zugriff auf die GPS-funktion und kannst da vorher schon das erzeugen des ' verhindern oder bekommst du einfach diesen String?
 
Das Problem war leider ein andres, die Daten werden ganz anders übergeben, ich hab hier eine Lösung, sorry, ich dachte echt es liegt an den Anführungszeichen.


local gpsValue = "unknown"

local function rnd(v,d)

if d then
return math.floor((v*10^d)+0.5)/(10^d)
else
return math.floor(v+0.5)
end
end

local function getTelemetryId(name)
field = getFieldInfo(name)
if field then
return field.id
else
return -1
end
end

local function init()
gpsId = getTelemetryId("GPS")
end

local function background()
gpsLatLon = getValue(gpsId)
if (type(gpsLatLon) == "table") then
gpsValue = rnd(gpsLatLon["lat"],4) .. ", " .. rnd(gpsLatLon["lon"],4)
else
gpsValue = "kein Signal"
end
end
 
Und nur um mal das mit den "Anführungszeichen" aufzuklären: Das sind vermutlich Prime, also die Zeichen für Winkelminuten.
' != ′ <- Das ist etwas nach rechts geneigt.
 
  • Gefällt mir
Reaktionen: TaranisX9d
Zurück
Oben