ReplaceString

Anfängerfragen zum Programmieren mit PureBasic.
Blackakito
Beiträge: 8
Registriert: 03.05.2015 14:19

ReplaceString

Beitrag 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
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: ReplaceString

Beitrag 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.
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: ReplaceString

Beitrag von Bisonte »

es liegt an dem "Chester", Das wird schon eine Stelle vorher gefunden und auch auf das zweite Chester angewandt
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Blackakito
Beiträge: 8
Registriert: 03.05.2015 14:19

Re: ReplaceString

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ReplaceString

Beitrag 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
Hygge
Blackakito
Beiträge: 8
Registriert: 03.05.2015 14:19

Re: ReplaceString

Beitrag von Blackakito »

Manchmal sieht man den Wald vor lauter Bäume nicht..... :oops:
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: ReplaceString

Beitrag 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
Signatur und so
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: ReplaceString

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ReplaceString

Beitrag 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
Hygge
Blackakito
Beiträge: 8
Registriert: 03.05.2015 14:19

Re: ReplaceString

Beitrag von Blackakito »

Hab gar nicht mitbekommen das dass Thema verschoben wurde....

Den Befehl SetDatabaseString() schau ich mir nochmal genauer an
Antworten