Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-11-2009, 11:54   #1
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
[C#] Split string

Salve a tutti, ho un problema nello splittare una stringa, vi faccio subito un esempio:

Questa e' la mia stringa:

1,-400,400,3,243834,'AAAAAA',52895,'BBBBB',660,'CCCCCC‚¬',2

Se uso il metodo split di string usando come delimitatore , mi separa anche questo campo: 'CCCCCC‚¬' in 'CCCCCC e ¬', io vorrei che invece passi oltre.. Come fare? Ovviamente questo e' solo un caso, la maggiorparte delle stringhe non ha di questi problemi.

Grazie.. ^^
Darecon è offline   Rispondi citando il messaggio o parte di esso
Old 27-11-2009, 14:14   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Pronti.... via.

Cerco di identificare tutti i token circondati da apice, chiamiamoli stringhe, in quanto le Virgole, all'interno di una stringa, non devono essere considerate per la split.

Quindi propongo la seguente:
1- Sostituisco tutte le occorrenze di ,' con un carattere di inzio stringa non altrimenti utilizzato. Es: <
2- Sostituisco tutte le occorrenze di ', con un carattere di fine stringa non altrimenti utilizzato. Es: >
3- Sostituisco ogni virgola presente tra un < e un > con un terzo carattere non utilizzato. Es: £.
3a- Attenzione, nella stringa ert,rty,<qwer>,<wert>,tyu,yui c'e' una virgola tra un < e un >, ma questa non sara' da considerare. La regola 3 estesa e' infatti: "Sostituisco ogni virgola presente tra un < e un > nella quale sono assenti altri < o > con un terzo carattere non utilizzato
4- posso risostituire indietro tutti i < e i > con i rispettivi ,' e ',
5- splitto la stringa sulle virgole, sicuro che non considerero' le virgole in mezzo ad una stringa (ora sono dei £)
6- passo ogni stringa splittata e sostituisco finalmente i £ con delle ,

Facile no?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 27-11-2009, 15:07   #3
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
Codice:
for (int i = 0; i < str.Length; i++)
                {
                    if (str[i] == '\'' && !aperto && str[i-1]==',')//evito che nome con la struttura aaa'aaa incasinino il tutto
                    {
                        aperto = true;
                        continue;
                    }
                    if (str[i] == '\'' && aperto)
                        aperto = false;
                    if (aperto)
                        if (str[i] == ',')
                            str=str.Substring(0,i)+"€"+str.Substring(i+1,str.Length-i-1);

                }
                string[] spl = str.Split(',');
                for (int j = 0; j < spl.Length; j++)
                {
                    string r = spl[j];
                    for (int i = 0; i < r.Length; i++)
                        if (r[i] == '€')
                            spl[j] = r.Replace('€', ',');
                }
Oh yeah, grazie per l'input, e' servito molto, ho adottato circa il tuo schema..
Darecon è offline   Rispondi citando il messaggio o parte di esso
Old 27-11-2009, 18:01   #4
bottomap
Member
 
Iscritto dal: Feb 2005
Città: Prato
Messaggi: 149
Ciao,

Se poi hai la facoltà di modificare la stringa a priori in fase di generazione, potresti scegliere un separatore (è da vedere se esiste) che sei sicuro non possa comparire nei vari elementi.
In questo modo elimineresti il problema direttamente alla radice... se non puoi farlo, la soluzione proposta da gugoXX è comunque ottimale.

Ciaociao
__________________
Venite a visitarci qui:http://www.bottomap.com
Bottomap is a proud Masterdrive.it moderator
bottomap è offline   Rispondi citando il messaggio o parte di esso
Old 27-11-2009, 18:08   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Bene.
Pero' fra 6 mesi, se devo rileggere, mi viene mal di testa.

Edit: Ripropongo, visto che ogni tanto pensare 1 minuto in piu' e' meglio.
Propongo la seguente, con una modifica variante dell'originale, sostanzialmetne identico alla tua

Codice:
static void Main(string[] args)
{
    string mstr = "1,-400,400,3,243834,'AAAAAA',52895,'BBBBB',660,'CCC,CCC,¬',2";

    mstr = Regex.Replace(mstr, "'[^']*'", str => str.Value.Replace(',', '£'));

    var res = mstr
        .Split(',')
        .Select(str => str.Replace('£', ','))
        .ToArray();                    
}
Per la Regex, e' da leggersi cosi':
Cerco tutte le sottosequenze che cominciano con ', terminano con ' e in mezzo hanno un qualsiasi set di caratteri (Eventualmente vuoto) NON composto '
sostituisco ciascuna di queste occorrenze con una nuova stringa, identica a ciascuna di quelle trovate, nelle quali sostituisco ciascun ',' con un '£'

L'ultimo invece e' una sequenza che serve solo per splittare su ',' rimpiazzare i '£' in ciascuna sottostringa e restituire l'array delle sottostringhe.

Occhio.
Il tuio primo ciclo cambia il dominio del for all'interno del ciclo stesso, e non e' mai troppo bello.
E la tua ultima parte e' poco effciente.
Le stringhe sono immutabili in C#. Ogni volta che scrivi
spl[j] = r.Replace('€', ','); //Basterebbe mettere spl[j]=','; no?
viene fatta una copia integrale della stringa, dove viene rimpiazzato solo l'elemento scelto...
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 27-11-2009 alle 18:24.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2009, 10:31   #6
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Bene.
Pero' fra 6 mesi, se devo rileggere, mi viene mal di testa.

Edit: Ripropongo, visto che ogni tanto pensare 1 minuto in piu' e' meglio.
Propongo la seguente, con una modifica variante dell'originale, sostanzialmetne identico alla tua

Codice:
static void Main(string[] args)
{
    string mstr = "1,-400,400,3,243834,'AAAAAA',52895,'BBBBB',660,'CCC,CCC,¬',2";

    mstr = Regex.Replace(mstr, "'[^']*'", str => str.Value.Replace(',', '£'));

    var res = mstr
        .Split(',')
        .Select(str => str.Replace('£', ','))
        .ToArray();                    
}
Per la Regex, e' da leggersi cosi':
Cerco tutte le sottosequenze che cominciano con ', terminano con ' e in mezzo hanno un qualsiasi set di caratteri (Eventualmente vuoto) NON composto '
sostituisco ciascuna di queste occorrenze con una nuova stringa, identica a ciascuna di quelle trovate, nelle quali sostituisco ciascun ',' con un '£'

L'ultimo invece e' una sequenza che serve solo per splittare su ',' rimpiazzare i '£' in ciascuna sottostringa e restituire l'array delle sottostringhe.

Occhio.
Il tuio primo ciclo cambia il dominio del for all'interno del ciclo stesso, e non e' mai troppo bello.
E la tua ultima parte e' poco effciente.
Le stringhe sono immutabili in C#. Ogni volta che scrivi
spl[j] = r.Replace('€', ','); //Basterebbe mettere spl[j]=','; no?
viene fatta una copia integrale della stringa, dove viene rimpiazzato solo l'elemento scelto...
Wow.. Si puo' fare quello cyhe ho fatto in cosi' poche righe?
Avresti una guida sulle regex che mi faccia capire bene come usarle?

EDIT: e se la stringa fosse string mstr = "1,-400,400,3,243834,'AAA'''AAA',52895,'BBBBB',660,'CCC,CCC,¬',2";

funzionerebbe?

In quanto la stringa da me postata ora e' da ritenersi valida.

Ultima modifica di Darecon : 28-11-2009 alle 10:46.
Darecon è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2009, 11:29   #7
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da Darecon Guarda i messaggi
Wow.. Si puo' fare quello cyhe ho fatto in cosi' poche righe?
Avresti una guida sulle regex che mi faccia capire bene come usarle?

EDIT: e se la stringa fosse string mstr = "1,-400,400,3,243834,'AAA'''AAA',52895,'BBBBB',660,'CCC,CCC,¬',2";

funzionerebbe?

In quanto la stringa da me postata ora e' da ritenersi valida.
Ciao.
Occorre modificare un pochino.
Con le Regex si comincia sempre cosi'. Si scrive la parte di base, e poi si comincia a raffinare fino a che si ottiene il risultato.
Alla fine purtroppo la maggior parte delle volte la RegEx risultera' illeggibile.

Finora ce l'abbiamo fatta senza renderla troppo brutta.

Codice:
static void Main(string[] args)
{
    string mstr = "1,-400,400,3,243834,'AAA'''AAA',52895,'BBBBB',660,'CCC,CCC,¬',2";

    mstr = Regex.Replace(mstr, ",'[^']*',", str => {
        string subStr = str.Value;
        string senzaInitFin = subStr.Substring(1,subStr.Length-2);
        return string.Format(",{0},",senzaInitFin);                
    });

    var res = mstr
        .Split(',')
        .Select(str => str.Replace('£', ','))
        .ToArray();
}
Come vedi modificando il codice di rimpiazzo.
E' probabile che giocando con i gruppi, una delle parti fondamentali delle RegEx, ce la si sarebbe fatta anche senza allungare troppo il codice di rimpiazzo, ma e' comunque ancora abbastanza leggibile e non troppo verboso.

Ma ora bisogna includere "forse" alcuni pezzi che non abbiamo considerato.
Neppure tu penso.

Questa, e' una stringa valida?

'werwer,qeqeq'

Ovvero se all'inizio (o alla fine) abbiamo una stringa come questa, che non comincia quindi con una , o non termina con una ,
(Addirittura penso che tu vada in segmentation fault)

E poi c'e' ancora questa, che penso sia valida

asdf,123,'qwrw''r,w'ewr',424,323

Dove l'algoritmo dovrebbe considerare 'qwrw''r,w'ewr' come tutta una stringa, e quindi non sostituire la (le) , in mezzo.
E qui sono ceci...

Sulle regex Online c'e' parecchio. Da leggersi ovviamente la reference dell MSDN, che pero' parte gia' dando per scontato come funzionano le RegEx
Puoi provare con Wikipedia.
Ma io sono un fan delle letture sul libro. Relativamente alle Regex mi sono trovato bene con un libro della O'Reilly (Quelli economici)
http://oreilly.com/catalog/9780596528126/
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 28-11-2009 alle 11:35.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2009, 11:44   #8
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
Giuste osservazioni..

Gli input li prendo in un file di testo, ho letto circa un 20k righe ed e' andato perfetto, pero' effettivamente c'e' la possibilita' che possa accadere, devo studiermelo un po'..

Per quanto riguarda il libro sembra ottimo, speriamo non parta da troppi preconcetti, perche' essendo anche in inglese mi sarebbe difficile.. pero' possiamo provare..
Darecon è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2009, 16:31   #9
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Facciamo cosi'.
Per evitare i PVT (nessuno si arrabbiera' se comincerai a postare dubbi sulle RegEx)
ti propongo la seguente:

Usando le fonti di informazione che hai trovato sulle Regular Expressions,
supponendo che questo successivo possa funzionare anche con le ultime considerazioni, prova a spiegare il perche'.

Codice:
static void Main(string[] args)
{
    string mstr = "1,-400,400,3,243834,'AAA'''B,AAA',52895,'BBBBB',660,'CCC,CCC,¬',2,'poi,'";

    mstr = string.Format(",{0},", mstr);

    mstr = Regex.Replace(mstr, ",'.*?',", str => {
        string subStr = str.Value;
        string senzaInitFin = subStr.Substring(1, subStr.Length - 2).Replace(',', '£');                
        return string.Format(",{0},",senzaInitFin);                
    });

    var res = mstr
        .Split(',')
        .Where(str => !string.IsNullOrEmpty(str))
        .Select(str => str.Replace('£', ','))
        .ToArray();            
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2009, 17:52   #10
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
Bella domanda..

Allora, iniziamo..

Prendo le stringhe che iniziano con ,' e terminano con ',.

Il carattere . e' un metacarattere che e' diciamo una wildcard, cioe' ha il valore di qualsiasi carattere.

L'asterisco indica che qualsiasi carattere e' presente 0 o piu' volte.
Il punto iterrogativo dice che puo' esserci o no..

Non capisco cosa sta a significare ? in questo caso.. Qualche aiuto?
Darecon è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2009, 21:45   #11
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da Darecon Guarda i messaggi
Bella domanda..

Allora, iniziamo..

Prendo le stringhe che iniziano con ,' e terminano con ',.

Il carattere . e' un metacarattere che e' diciamo una wildcard, cioe' ha il valore di qualsiasi carattere.

L'asterisco indica che qualsiasi carattere e' presente 0 o piu' volte.
Il punto iterrogativo dice che puo' esserci o no..

Non capisco cosa sta a significare ? in questo caso.. Qualche aiuto?
qui c'e' una pagina riassuntiva.
http://www.dijksterhuis.org/csharp-r...r-cheat-sheet/
*? e' un quantificatore a se stante, particolare...
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 30-11-2009, 20:04   #12
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
qui c'e' una pagina riassuntiva.
http://www.dijksterhuis.org/csharp-r...r-cheat-sheet/
*? e' un quantificatore a se stante, particolare...
Ciao, scusami se ti rispondo solo ora, potresti spiegarmi il significato di quell'operatore? non ho ben capito il funzionamento..

Grazie..
Darecon è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Portatili con 32GB e 40GB di RAM e 1TB S...
Prezzo dell'ittrio fuori controllo: perc...
Grazie a VLT è stata misurata dir...
Blue Origin annuncia un aerofreno ripieg...
Blue Origin annuncia una nuova versione ...
LG UltraFine evo 6K: il primo monitor al...
DJI cambia direzione: investe in Elegoo ...
Black Friday Narwal 2025: risparmi da ca...
Phishing evoluto contro Apple ID: caso f...
Prestazioni in discesa nei giochi? NVIDI...
Addio ai banner dei cookie? L'UE spinge ...
Le offerte Black Friday per gli smartpho...
Il controllo qualità degli iPhone...
Qualcomm Snapdragon X Elite vola con il ...
A2RL Season 2: storia, innovazione e sor...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:33.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v