Autor Beitrag
D.Elphi
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 128
Erhaltene Danke: 10

Windows 10 Edu x64
Tokyo Starter, BlueJ
BeitragVerfasst: Do 10.05.18 23:28 
Moin zusammen,

folgendes Problem: Für die Uni sitze ich an einem Programm, welches, um Tipparbeit zu sparen, aus fertigen Tabellen im Foliensatz des Dozenten SQL-Insert-Statements erzeugen soll (über Copy und Paste). Hierzu lese ich ein Memo in eine StringList ein, hänge jeweils Klammern und Kommas an Anfang bzw. Ende und trenne die Werte voneinander mit Komma mittels StringReplace. Das Grundgerüst funktioniert soweit ganz gut, allerdings möchte ich nun die Textbestandteile der Tabellenzeile mit Single Quotes (') abgrenzen. Ein Beispiel:

Zeile aus dem Foliensatz: 1234 Test 12345 XYZ
Mein Programm macht daraus bis jetzt: (1234, Test, 12345, XYZ),
Was es machen soll: (1234, 'Test', 12345, 'XYZ'),

Wie kann ich also implementieren, dass die Bestandteile, die keine Zahlen sind, mit Single Quotes versehen werden? Ich habe gelesen, dass das wohl mit regulären Ausdrücken geht, allerdings scheitere ich an der Implementierung bzw. an der Erstellung eines korrekten RegEx. Kann mir hier jemand weiterhelfen?

Darüber hinaus möchte ich - aber das ist prinzipiell optional - Attribute, die aus mehreren Wörtern bestehen (d.h. "Das ist ein Test" statt "Test") ebenfalls als ein Wert in das Statement einbringen können. Hierzu habe ich implementiert, dass das Attribut mit dem Zeichen | als Delimiter abgegrenzt wird. Wie kann ich also den Bereich zwischen den Delimitern jeweils mit Single Quote begrenzen? StringReplace ersetzt hier zwar den Delimiter durch die Single Quote, allerdings werden die Wörter dazwischen auch wiederum mit Kommas getrennt --> Beispiel: aus 1234 |Das ist ein Test| 12345 XYZ wird 1234, 'Das, ist, ein, Test', 12345, XYZ. Auch hier bräuchte ich Hilfe.

Danke schonmal!


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 15.05.2018 um 21:00
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Mi 16.05.2018 um 08:29
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62
Erhaltene Danke: 27

Win95 - Win11 / MSServer2000 - MSServer2019
Delphi 6pro / XE4
BeitragVerfasst: Fr 11.05.18 09:02 
Hmm..

user profile iconD.Elphi hat folgendes geschrieben Zum zitierten Posting springen:
Moin zusammen,

folgendes Problem: Für die Uni sitze ich an einem Programm, welches, um Tipparbeit zu sparen, aus fertigen Tabellen im Foliensatz des Dozenten SQL-Insert-Statements erzeugen soll (über Copy und Paste). Hierzu lese ich ein Memo in eine StringList ein, hänge jeweils Klammern und Kommas an Anfang bzw. Ende und trenne die Werte voneinander mit Komma mittels StringReplace.

...

Wie kann ich also implementieren, dass die Bestandteile, die keine Zahlen sind, mit Single Quotes versehen werden? Ich habe gelesen, dass das wohl mit regulären Ausdrücken geht, allerdings scheitere ich an der Implementierung bzw. an der Erstellung eines korrekten RegEx. Kann mir hier jemand weiterhelfen?
...


Erstmal vorweg ein paar Fragen:
- Weißt Du anhand des Foliensatzes, welche Datenbank-Felder hiervon 'String' oder 'Zahl' sind?
Denn nur anhand des Textes kannst Du nicht erkennen, ob das Datenbankfeld ein 'String'-Feld ist.
Außerdem müsste auch eine Zahl (z.B. 12345) bei einem Stringfeld in Quottes gesetzt werden.
Somit muss der Text des Foliensatzes entsprechend des Ziel-Feldes auf Inhalt geprüft werden und dann mit '' formatiert werden.

- Mit welchem Trennzeichen sind denn die einzelnen Felder im Foliensatzes von einander getrennt?
Wenn dort z.B. der Tab (#9) als Trenner verwendet wird, dann müsstest Du deine Routine zum Ersetzen mit ',' nur ändern und alle Stringfelder (Text zwischen 2 Tabs) direkt mit einem Quote an der Stelle des ',' versehen.

Sprich aus
12345<tab>Hallo, ihr da<tab> 12345<tab> 0
(Integer Feld)<tab>(String-Feld)<tab>(String-Feld)<tab>(Integer-Feld)

Würde
12345,'Hallo, ihr da',' 12345',0


Hinweis:
Wenn Du einen Text einfach ohne Prüfung in einen SQL wandelst, kann damit SQL-Injection erfolgen... ;)
lapadula
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Di 15.05.18 16:00 
Habe das mit den single quotes folgedermaßen gelöst:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private void button3_Click(object sender, EventArgs e)
        {
            string s = "1234 Test 12345 XYZ";
            var blah = Regex.Replace(s, @"[\S;][a-zA-Z]+"new MatchEvaluator(RegExen.Test));

            MessageBox.Show(blah);
        }
    }
    public class RegExen
    {
        public static string Test(Match m)
        {
           return m.Value.Insert(0"'").Insert(m.Value.Length + 1"'");
        }
    }


edit: sehe jetzt das ich im Delphi forum bin, sorry.
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62
Erhaltene Danke: 27

Win95 - Win11 / MSServer2000 - MSServer2019
Delphi 6pro / XE4
BeitragVerfasst: Mi 16.05.18 10:16 
Hmm..

"1234 Test 12345 XYZ"

Wenn Du hier Leerzeichen als Trenner zwischen den Feldern hast, wird es nicht verlässlich klappen!
Denn was kommt bei "1234 Dieser Text hat Leerzeichen 12345 xyz" ?

1234,'Dieser','Text','hat','Leerzeichen',12345,'xyz'

Irgendwie ein paar Datenfelder mehr ;)

Auch kann ein STRING-Datenfeld als Text 12345 enthalten und benötigt bei den meisten DB-Komponenten ein '12345'!

(Unabhängig welche Programmiersprache Du verwendest ;) )
lapadula
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Mi 16.05.18 13:31 
Dazu hat D.Elphi geschrieben, dass er dies durch den Senkrechten Strich abgrenzt. Ich habe dazu den Ausdruck angepasst:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
string s = "1234 |Das ist ein Test| 12345 XYZ";
var blah = Regex.Replace(s, @"\|(.*?)\||[\S;][a-zA-Z]+"new MatchEvaluator(RegExen.Test));

//Ausgabe: 1234 'Das ist ein Test' 12345 'XYZ'
...
return m.Value.Insert(0"'").Insert(m.Value.Length + 1"'").Replace("|","");


Ist immernoch nicht fehlerfrei aber man kann den ja erweitern, ist jetzt nur für den einen String getestet worden.