Discussion:
Replace stolpert ein wenig
(zu alt für eine Antwort)
Georg Gruber
2023-07-07 09:00:45 UTC
Permalink
Ergänzung fehlender Quoten in einer Kursdatei:

RE_Parse ($line, ";([0-9,.]+);", $quote)
$line = replace ($line, "; ;", ";"+$quote+";", true)

In : 2019-01-29; ; ; ;1.992;
Out: 2019-01-29;1.992; ;1.992;1.992;

Beim ersten Durchlauf wird der mittlere fehlende Wert nicht ergänzt,
dafür braucht es einen zweiten Scriptlauf.

In : 2019-01-29;1.992; ;1.992;1.992;
Out: 2019-01-29;1.992;1.992;1.992;1.992;
--
LG Georg

Löwen föhnen ist keine TikTok-Challenge.
Heiko Rost
2023-07-07 10:05:57 UTC
Permalink
Post by Georg Gruber
RE_Parse ($line, ";([0-9,.]+);", $quote)
$line = replace ($line, "; ;", ";"+$quote+";", true)
In : 2019-01-29; ; ; ;1.992;
Out: 2019-01-29;1.992; ;1.992;1.992;
Beim ersten Durchlauf wird der mittlere fehlende Wert nicht ergänzt,
dafür braucht es einen zweiten Scriptlauf.
In : 2019-01-29;1.992; ;1.992;1.992;
Out: 2019-01-29;1.992;1.992;1.992;1.992;
Meines Erachtens nach verhält sich replace korrekt. Das erste "; ;"
wurde gefunden und ersetzt. Das mittlere "; ;" existiert dann nicht
mehr, weil das ";" vom Anfang bereits verarbeitet wurde. Die Funktion
testet also weiter ab " ; ;1.992;" und findet dort nur noch eine weitere
zu ersetzende Zeichenkette-

Um das von Dir erwartete Ergebnis zu liefern, müßte replace rekursiv
arbeiten, also prüfen, ob nach dem Ersetzen eine Zeichenkette entstanden
ist, in der weitere Ersetzungen möglich sind. Wenn Du so etwas in der
Praxis machen willst, mußt Du das replace innerhalb einer Schleife
nutzen.

Gruß Heiko
--
Jeder Zwang ist Gift für die Seele.
Ludwig Börne
Georg Gruber
2023-07-07 21:06:55 UTC
Permalink
Post by Heiko Rost
Post by Georg Gruber
RE_Parse ($line, ";([0-9,.]+);", $quote)
$line = replace ($line, "; ;", ";"+$quote+";", true)
In : 2019-01-29; ; ; ;1.992;
Out: 2019-01-29;1.992; ;1.992;1.992;
Beim ersten Durchlauf wird der mittlere fehlende Wert nicht ergänzt,
dafür braucht es einen zweiten Scriptlauf.
In : 2019-01-29;1.992; ;1.992;1.992;
Out: 2019-01-29;1.992;1.992;1.992;1.992;
Meines Erachtens nach verhält sich replace korrekt. Das erste "; ;"
wurde gefunden und ersetzt. Das mittlere "; ;" existiert dann nicht
mehr, weil das ";" vom Anfang bereits verarbeitet wurde. Die Funktion
testet also weiter ab " ; ;1.992;" und findet dort nur noch eine weitere
zu ersetzende Zeichenkette-
Um das von Dir erwartete Ergebnis zu liefern, müßte replace rekursiv
arbeiten, also prüfen, ob nach dem Ersetzen eine Zeichenkette entstanden
ist, in der weitere Ersetzungen möglich sind. Wenn Du so etwas in der
Praxis machen willst, mußt Du das replace innerhalb einer Schleife
nutzen.
Hab ich zwischezeitlich so realisiert.
Eine Rekursion im replace könnte in ungünstigen Fällen endlos loopen,
wenn ich es mir recht überlege.
Danke für die rasche Antwort.
--
LG Georg

Löwen föhnen ist keine TikTok-Challenge.
Thomas Barghahn
2023-07-07 11:25:00 UTC
Permalink
Post by Georg Gruber
RE_Parse ($line, ";([0-9,.]+);", $quote)
$line = replace ($line, "; ;", ";"+$quote+";", true)
In : 2019-01-29; ; ; ;1.992;
Out: 2019-01-29;1.992; ;1.992;1.992;
Oder so mit einem Durchlauf:

RE_Parse ($line, ";([0-9,.]+);", $quote)
$line = replace ($line, " ;", $quote + ";", true)

In : 2019-01-29; ; ; ;1.992;
Out: 2019-01-29;1.992;1.992;1.992;1.992;

Thomas 😷
--
== S E N D E Z E I T =====================
  DATUM : Freitag, 07. Juli 2023
  UHRZEIT: 13:25:00 UHR (MESZ)
== Heute: Bundesweiter Tag des Freibads ==
Georg Gruber
2023-07-07 21:12:29 UTC
Permalink
Post by Georg Gruber
Post by Georg Gruber
RE_Parse ($line, ";([0-9,.]+);", $quote)
$line = replace ($line, "; ;", ";"+$quote+";", true)
In : 2019-01-29; ; ; ;1.992;
Out: 2019-01-29;1.992; ;1.992;1.992;
RE_Parse ($line, ";([0-9,.]+);", $quote)
$line = replace ($line, " ;", $quote + ";", true)
In : 2019-01-29; ; ; ;1.992;
Out: 2019-01-29;1.992;1.992;1.992;1.992;
Auch eine Möglichkeit, danke!
--
LG Georg

Löwen föhnen ist keine TikTok-Challenge.
Loading...