Seite 1 von 1

ReplaceString

Verfasst: 23.02.2017 21:47
von Blackakito
Hallo,

kann es sein das ReplaceString() buggy ist?

Ich habe vor Csv -Daten in Sqlite einzulesen, dafür muss ich diese Zeilen aber erst in SQlite kompatible machen,

Folgender Code bereitet mir Kopfzerbrechen

Code: Alles auswählen

        sql_werte.s = "E3,28/08/93,Chester,Chesterfield,3,1,H"

        sql_werte = ReplaceString(SQL_Werte, StringField(SQL_Werte, 3, ","), "'" + StringField(SQL_Werte, 3, ",") + "'")
        
        Debug sql_werte

        SQL_Werte = ReplaceString(SQL_Werte, StringField(SQL_Werte, 4, ","), "'" + StringField(SQL_Werte, 4, ",") + "'")
       
        Debug sql_werte
Warum liefert ReplaceString diesen Rückgabewert?
"E3,28/08/93,'Chester',''Chester'field',3,1,H" :o

Zu erwarten wäre folgender Wert:
"E3,28/08/93,'Chester','Chesterfield',3,1,H"

Wenn ich "Chesterfield" in "CXhesterfield" umbennene funktioniert es einwandfrei.

__________________________________________________
Thread verschoben
Bugs>Anfänger
23.02.2017
RSBasic

Re: ReplaceString

Verfasst: 23.02.2017 22:14
von CSHW89
Weil du versucht alle Vorkommnisse von Chester durch 'Chester' zu ersetzen. Im String gibt es nunmal zwei. ReplaceString macht kein Halt vor Wörtern. Wenn eine Zeichenkette gefunden wurde, wird sie ersetzt. Ich rede übrigens nur vom ersten ReplaceString.

Re: ReplaceString

Verfasst: 23.02.2017 22:16
von Bisonte
es liegt an dem "Chester", Das wird schon eine Stelle vorher gefunden und auch auf das zweite Chester angewandt

Re: ReplaceString

Verfasst: 23.02.2017 22:26
von Blackakito
Also, ich übergebe diese Werte nicht einfach so.

Such und Ersatzstring wird jeweils von einem Stringfield gefüllt.

In dem Fall sucht er nur nach Chester und soll nur in 'Chester" ersetzen

Chesterfield sollte eigentlich gar nicht vorkommen, dieser wird erst im zweiten ReplaceString bearbeitet

Re: ReplaceString

Verfasst: 23.02.2017 22:35
von Kiffi
Blackakito hat geschrieben:In dem Fall sucht er nur nach Chester [...]
... welches in Deinem String 2mal gefunden wird. Einmal Chester und einmal Chesterfield.

Grüße ... Peter

Re: ReplaceString

Verfasst: 23.02.2017 22:43
von Blackakito
Manchmal sieht man den Wald vor lauter Bäume nicht..... :oops:

Re: ReplaceString

Verfasst: 24.02.2017 00:18
von Derren
Hm, komisch, niemand erwähnt die Hilfe :D

ReplaceString(String$, StringToFind$, ReplacementString$ [, Mode [, StartPosition [, NbOccurrences]]])
NbOccurrences (optional): Specifies how many strings should be replaced before stopping the operation. If omitted, all strings are replaced.


Code: Alles auswählen

 sql_werte.s = "E3,28/08/93,Chester,Chesterfield,3,1,H"

        sql_werte = ReplaceString(SQL_Werte, StringField(SQL_Werte, 3, ","), "'" + StringField(SQL_Werte, 3, ",") + "'",  #PB_String_CaseSensitive , 0, 1) ;die 1 am Ende schafft Abhilfe ;)
       
        Debug sql_werte

Das ist allerdings auch nicht wirklich sicher.
Wenn dein String "E3,28/08/93,Chesterfield,Chester,3,1,H" lautet
und du zu erst Chesterfield mit 'Chesterfield' ersetzt passt es noch.
Wenn du dann aber mit NbOccurences = 1 "Chester" ersetzen willst, bekommst du "E3,28/08/93,''Chester'field',Chester,3,1,H"
Es sei denn du änderst den vorletzten Parameter auch entsprechend.


Am besten ist es allerdings, wenn du das so machst:

Code: Alles auswählen

Define sql_werte.s = "E3,28/08/93,Chesterfield,Chester,3,1,H"
Define sql_new.s
N = CountString(sql_werte, ",")+1
For i=1 To N
  sql_new + "'" + StringField(sql_werte, i, ",") + "',"
Next
sql_new = Trim(sql_new, ",")
Debug sql_new

Re: ReplaceString

Verfasst: 24.02.2017 12:45
von #NULL
man kann auch die kommas ersetzen

Code: Alles auswählen

sql_werte.s = "E3,28/08/93,Chester,Chesterfield,3,1,H"

field.s = StringField(SQL_Werte, 3, ",")
Debug ReplaceString(SQL_Werte,  "," + field + ",",  ",'" + field + "',")

Debug "'" + ReplaceString(SQL_Werte, ",", "','") + "'"
besser ist aber die schleife.

Re: ReplaceString

Verfasst: 24.02.2017 13:37
von Kiffi
die eigentlich Problematik ist allerdings noch gar nicht aufgefallen:
Blackakito hat geschrieben:Ich habe vor Csv -Daten in Sqlite einzulesen, dafür muss ich diese Zeilen aber erst in SQlite kompatible machen,
hierfür eignen sich die SetDatabase*() - Befehle. Hiermit werden Werte an Platzhalter ('?') innerhalb eines SQL-Statements gebunden. Um die Datentypen muss man sich dann nicht mehr kümmern (z.B. Strings in Hochkommata setzen). Ein angenehmer Nebeneffekt ist, dass man damit SQL-Injections verhindern kann:

Code: Alles auswählen

EnableExplicit

Define sql_werte.s
Define DB
Define Counter

UseSQLiteDatabase()

sql_werte = "E3,28/08/93,Chester,Chesterfield,3,1,H"

DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)

DatabaseUpdate(DB, "Create Table myTable ( myField1 TEXT,  myField2 TEXT,  myField3 TEXT,  myField4 TEXT,  myField5 INT,  myField6 INT,  myField7 TEXT)")

SetDatabaseString(DB, 0,     StringField(sql_werte, 1, ","))  ; myField1: E3
SetDatabaseString(DB, 1,     StringField(sql_werte, 2, ","))  ; myField2: 28/08/93
SetDatabaseString(DB, 2,     StringField(sql_werte, 3, ","))  ; myField3: Chester
SetDatabaseString(DB, 3,     StringField(sql_werte, 4, ","))  ; myField4: Chesterfield
SetDatabaseLong  (DB, 4, Val(StringField(sql_werte, 5, ","))) ; myField5: 3
SetDatabaseLong  (DB, 5, Val(StringField(sql_werte, 6, ","))) ; myField6: 1
SetDatabaseString(DB, 6,     StringField(sql_werte, 7, ","))  ; myField7: H

DatabaseUpdate(DB, "Insert Into myTable Values (?, ?, ?, ?, ?, ?, ?)")

DatabaseQuery(DB, "Select * From myTable")

NextDatabaseRow(DB)

For Counter = 0 To 6
  Debug DatabaseColumnName(DB, Counter) + ": " + GetDatabaseString(DB, Counter)
Next
Grüße ... Peter

Re: ReplaceString

Verfasst: 26.02.2017 00:23
von Blackakito
Hab gar nicht mitbekommen das dass Thema verschoben wurde....

Den Befehl SetDatabaseString() schau ich mir nochmal genauer an