Toon posts:

[C#] String omzetten naar VA list

Pagina: 1
Acties:
  • 138 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Iedereen kent het wel: schakelopties zoals het met een mooi woord heet...
vb:
ping -t tweakers.net

met de schakel optie specificeer je het een en ander dat door jou app gebruikt kan worden..
In C# is dit makkelijk declareer je main met een string[] args als input-> roep je app aan met:
mijnapp.exe -s "henkie- 1"

args zal dan lengte 2 hebben
met op plekje 0 = "-s" en op plekje 1 = "henkie- 1"

Nu wil ik eigenlijk het volgende
ik wil een string (bijvoorbeeld "-s "henkie- 1"" ) omzetten naar die args list.. Alleen ik kom er niet uit hoe dit moet? Je zou een split kunnen doen op bijv een spatie of scheidings teken, maar dit gaat vaak fout (zie ook voorbeeld). Ook dient uiteraard de " tekens te worden verwijdert! dit is iets dat normaal automaatisch gaat, alles tusse "" tekens wordt als één geheel gezien. Nu is dit zo'n generieke funtie dat ik mij verbaasde dat ik dit niet op het (bijna) almachtige google kon vinden!! Wie heeft er tips/oplossingen?? Want om zelf een hele substring/split join welke alle parameters ondersteund te schrijven is volgens mij het wiel opnieuw uitvinden

  • lier
  • Registratie: Januari 2004
  • Nu online

lier

MikroTik nerd

Het voorbeeld van de string die jij geeft is geen string...
Je zou kunnen overwegen om gebruik te maken van single quotes of gebruik maken van een seperator teken (maakt niet zo veel uit welke, als deze maar niet in je string verwacht wordt).

Veel toegepast is de comma seperator, dit zou als string voor jou zijn:
"-s,henkie -1"

Eerst het probleem, dan de oplossing


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
ericexprt, kan je even op je layout en spelling letten, want je post is nu niet echt uitnodigend om te lezen.

lier, waarom is hetgeen de topicstarter heeft, geen string ? Het voorbeeld dat hij geeft, is gewoon wel een string.

Ik denk dat je gewoon best een parser kunt schrijven; misschien kan je starten door te splitten op '-'

[ Voor 18% gewijzigd door whoami op 12-04-2007 10:33 ]

https://fgheysels.github.io/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
lier schreef op donderdag 12 april 2007 @ 10:26:
Het voorbeeld van de string die jij geeft is geen string...
Waarom niet :?
lier schreef op donderdag 12 april 2007 @ 10:26:
Het voorbeeld van de string die jij geeft is geen string...
Je zou kunnen overwegen om gebruik te maken van single quotes of gebruik maken van een seperator teken (maakt niet zo veel uit welke, als deze maar niet in je string verwacht wordt).
Een spatie als separator is toch niet verschillend? Je moet alleen waardes tussen quotes aan elkaar plakken.
lier schreef op donderdag 12 april 2007 @ 10:26:
Het voorbeeld van de string die jij geeft is geen string...
Veel toegepast is de comma seperator, dit zou als string voor jou zijn:
"-s,henkie -1"
Again: comma, slash of ampersand... een separator is een separator en dat kan net zo goed een space zijn.

Wat betreft de TS: goeie vraag eigenlijk :X Geen idee.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • lier
  • Registratie: Januari 2004
  • Nu online

lier

MikroTik nerd

whoami: een string in C# wordt altijd opgebouwd tussen quotes. Er zou hooguit sprake kunnen zijn van een concatinatie, maar daarvoor moeten de variabelen wel met behulp van de + operator aan de strings "vastgeplakt" worden.

Dus het voorbeeld "-s "henkie- 1"" houdt in:

"-s " (eerste string)
henkie- 1 (variabele -1)
"" (tweede string)

Dit komt dus (in de beste situatie) neer op een string array...(net als args)

Probeer bijvoorbeeld maar eens de volgende regel:
string s = "-s "henkie- 1"";

Dit zal een compile error opleveren.

Hoop dat mijn uitleg een beetje duidelijk is !?

[ Voor 20% gewijzigd door lier op 12-04-2007 10:39 ]

Eerst het probleem, dan de oplossing


Verwijderd

Topicstarter
RobIII schreef op donderdag 12 april 2007 @ 10:32:
[...]

Waarom niet :?


[...]

Een spatie als separator is toch niet verschillend? Je moet alleen waardes tussen quotes aan elkaar plakken.


[...]

Again: comma, slash of ampersand... een separator is een separator en dat kan net zo goed een space zijn.

Wat betreft de TS: goeie vraag eigenlijk :X Geen idee.
Inderdaad je slaat de spijker op de kop, eigenlijk is dit best een handige functie, je zou er veel leuke dingen mee kunnen doen. Veel programma's hebben gewoon in het windows een textvak waar je commando's + parameters in kun intypen (denk aan autocad). Maar "windows" interpreteerd dit normaal voor je... maar jah in dit geval??? Wie heeft een idee!! :9

  • user109731
  • Registratie: Maart 2004
  • Niet online
Gewoon zelf parsen lijkt me het beste. En dan een boolean bijhouden of je tussen quotes zit. Kom je een seperator tegen, is boolean false: nieuw argument beginnen, true: spatie appenden. :)

Misschien is er een ingebouwde functie, maar zelf parsen is goed te doen in C#.

[ Voor 18% gewijzigd door user109731 op 12-04-2007 10:41 ]


Verwijderd

Topicstarter
lier schreef op donderdag 12 april 2007 @ 10:35:
whoami: een string in C# wordt altijd opgebouwd tussen quotes. Er zou hooguit sprake kunnen zijn van een concatinatie, maar daarvoor moeten de variabelen wel met behulp van de + operator aan de strings "vastgeplakt" worden.

Dus het voorbeeld "-s "henkie- 1"" houdt in:

"-s " (eerste string)
henkie- 1 (variabele -1)
"" (tweede string)

Dit komt dus (in de beste situatie) neer op een string array...(net als args)

Probeer bijvoorbeeld maar eens de volgende regel:
string s = "-s "henkie- 1"";

Dit zal een compile error opleveren.

Hoop dat mijn uitleg een beetje duidelijk is !?
je denkt iets te veel in computer taal :+
in computertaal de string: "-s \"henkie- 1\""
of als je het in een magazin oid zou lezen:
-s "henkie- 1"
Je snapt de bedoeling?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
lier schreef op donderdag 12 april 2007 @ 10:35:
whoami: een string in C# wordt altijd opgebouwd tussen quotes. Er zou hooguit sprake kunnen zijn van een concatinatie, maar daarvoor moeten de variabelen wel met behulp van de + operator aan de strings "vastgeplakt" worden.
En het voorbeeld dat de TS heeft staat niet tussen quotes misschien ?
En wat levert een concatenatie op ... een string.
Probeer bijvoorbeeld maar eens de volgende regel:
string s = "-s "henkie- 1"";
Tja, misschien een typefoutje van de topicstarter.
code:
1
string s = @"-s "henkie -1"";
geeft geen errors.
Neemt niet weg dat dit gewoon een string is, waarin quotes voorkomen.

Maar, zoals ik al zei, schrijf een eigen parser, en begin misschien met te splitten op '-'. Dat levert je al een string array op, waarin iedere string binnen die array een schakeloptie met z'n value oplevert.
Dan moet je gewoon nog iedere schakeloptie gaan parsen...
Misschien dat je er dan kunt vanuit gaan dat alles tot aan de eerste spatie je optie is, en alles daarna je value is.

[ Voor 21% gewijzigd door whoami op 12-04-2007 10:45 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
JanDM schreef op donderdag 12 april 2007 @ 10:39:
Gewoon zelf parsen lijkt me het beste. En dan een boolean bijhouden of je tussen quotes zit. Kom je een seperator tegen, is boolean false: nieuw argument beginnen, true: spatie appenden. :)
En wéér het wiel opnieuw uitvinden? Windows/.NET heeft honderd duizend ik weet niet hoeveel functies. En ik heb een hekel aan programma's waar gewoon functies in worden gemaakt die "ergens" al voor het oprapen liggen, waarbij de nieuw gemaakte functie, vaak niet voor 100% support biedt. Tevens hebben bestaande functies zich al bewezen/ zit al jaren onderhoudt/ontwikkeling in!!!
Danku...

[ Voor 9% gewijzigd door Verwijderd op 12-04-2007 10:45 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Tja, programmeren is wel meer dan enkel de voorgedefinieerde functies gebruiken. ;)
Schrijf een generieke parse-functie die je in alle app's kunt gebruiken, publiceer ze en wordt rijk ofzo...

https://fgheysels.github.io/


  • user109731
  • Registratie: Maart 2004
  • Niet online
whoami schreef op donderdag 12 april 2007 @ 10:43:
Maar, zoals ik al zei, schrijf een eigen parser, en begin misschien met te splitten op '-'. Dat levert je al een string array op, waarin iedere string binnen die array een schakeloptie met z'n value oplevert.
Dan moet je gewoon nog iedere schakeloptie gaan parsen...
Misschien dat je er dan kunt vanuit gaan dat alles tot aan de eerste spatie je optie is, en alles daarna je value is.
Hou wel rekening met -'s tussen quotes... :) Daarom zou ik gewoon char voor char parsen, plus een stel booleans, lekker makkelijk ;)

@TS: je had ondertussen al lang een goede parser klaar kunnen hebben :P

[ Voor 12% gewijzigd door user109731 op 12-04-2007 10:49 ]


Verwijderd

Topicstarter
whoami schreef op donderdag 12 april 2007 @ 10:43:
Maar, zoals ik al zei, schrijf een eigen parser, en begin misschien met te splitten op '-'. Dat levert je al een string array op, waarin iedere string binnen die array een schakeloptie met z'n value oplevert.
Dan moet je gewoon nog iedere schakeloptie gaan parsen...
Misschien dat je er dan kunt vanuit gaan dat alles tot aan de eerste spatie je optie is, en alles daarna je value is.
En vervolgens zit er '-' in de schakelopties (in de string van de string zeg maar zoals HENKI- 2 ??)

  • Shezzie
  • Registratie: Januari 2005
  • Laatst online: 01-12 11:21

Shezzie

Lekker hoor!

Onderstaande zal je wel uit de brand helpen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private void SplitString(string szRaw, ArrayList arArgs) {
            bool bInText = false;
            string s = string.Empty;
            
            for (int c = 0;c< szRaw.Length; c++) {
                switch (szRaw[c]) {
                    case ' ': 
                        if (!bInText) {
                             arArgs.Add(s);
                            s = string.Empty;
                        } else s+= szRaw[c];
                        break;
                    case '\"': 
                        bInText = !bInText;
                        break;
                    default:
                         s += szRaw[c];
                         break;
                    
                }           
            }
            if (s.Length > 0) arArgs.Add(s);
        }


Variaties hierop gebruik ik al jaren om csv-files uit elkaar te trekken bij dataconversies :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Hmm, Ok, te kort door de bocht. :P

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op donderdag 12 april 2007 @ 10:46:
Tja, programmeren is wel meer dan enkel de voorgedefinieerde functies gebruiken. ;)
Schrijf een generieke parse-functie die je in alle app's kunt gebruiken, publiceer ze en wordt rijk ofzo...
:+ :+ K*T nu hebben jullie mn plan :+ :+
Anyway, niemand weet dus dat deze, reeds bestaande functionaliteit, ergens aan te roepen is :P

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Hmm, misschien moest je toch ff beter googlen (met de juiste keywords)




klik
klik

[ Voor 24% gewijzigd door whoami op 12-04-2007 10:53 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Shezzie schreef op donderdag 12 april 2007 @ 10:48:
Onderstaande zal je wel uit de brand helpen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private void SplitString(string szRaw, ArrayList arArgs) {
            bool bInText = false;
            string s = string.Empty;
            
            for (int c = 0;c< szRaw.Length; c++) {
                switch (szRaw[c]) {
                    case ' ': 
                        if (!bInText) {
                             arArgs.Add(s);
                            s = string.Empty;
                        } else s+= szRaw[c];
                        break;
                    case '\"': 
                        bInText = !bInText;
                        break;
                    default:
                         s += szRaw[c];
                         break;
                    
                }           
            }
            if (s.Length > 0) arArgs.Add(s);
        }


Variaties hierop gebruik ik al jaren om csv-files uit elkaar te trekken bij dataconversies :)
Mm dat ziet er interesant uit!! zkr het commentaar: werkt al jaren in de zin van geen fouten klinkt goed.. eens proberen :9

Mensen die een generieke oplossing vinden zijn natuurlijk altijd welkom

edit:

Deze code doet exact wat ik wilde!! het werkt uitstekend... Dank u Shezzie !!!1 _/-\o_ _/-\o_

[ Voor 5% gewijzigd door Verwijderd op 12-04-2007 11:09 ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Het kan wel met standaard functies (dus zonder dat je zelf elke character in de string af moet gaan):

Je schrijft 2 app's: app1 print argumenten onder elkaar (evt eerst de argc), app2 voert app1 uit met de string als argument en leest het resultaat uit.

Maar of het verstandig is...


[edit]
Er is ook een echte standaardmanier in Shell32.dll: CommandLineToArgvW.

[ Voor 21% gewijzigd door Daos op 12-04-2007 12:46 ]

Pagina: 1