Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15

    Ottenere tutti i caratteri di un testo [C#]

    Il programma deve scorrere ogni char presente in una stringa e se è uguale a x (per esempio) deve sostituire il testo con un altro carattere, che può variare.

    Mi sono spiegato malissimo lo so xD

    In poche parole vorrei eliminare tutta la punteggiatura di un testo e mettere ogni parola in colonna, magari esiste un metodo più semplice ma io voglio che sia perfetto, non deve saltarne uno...

    Prendiamo per esempio una stringa che contiene il seguente valore : "L'amica di Mario è bellissima."

    deve diventare così:

    L
    amica
    di
    Mario
    è
    bellissima

    Se non avete capito chiedete... cercherò di spiegarmi meglio. Spero in qualche risposta, io ho già provato col metodo split però è poco preciso, avvolte dimentica apostrofi e punti... bho...

    PS: Tenete presente che un testo può essere così: "L'amica di Mario,è bellissima" , oppure così: "L' amica di Mario è bellissima" nel primo caso la punteggiatura è unita alla parola perciò un semplice replace penso che non funzioni e tenete anche presente che deve elaborare mooolte pagine, quindi deve essere il più veloce possibile.

  2. #2
    Ci sono svariati metodi, eccone un paio, sicuramente perfezionabili:
    codice:
            private void button1_Click(object sender, EventArgs e)
            {
                string s = "L'amica di Mario è bellissima.";
                char[] c = " ,.;:-_'+*[]{}!\"£$%&/\\()=?^<>".ToCharArray();
                string[] a = s.Split(c, StringSplitOptions.RemoveEmptyEntries);
                
                foreach(string i in a)
                {
                    Console.WriteLine(i);
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                string s = "L'amica di Mario è bellissima.";
                s = Regex.Replace(s, "[\\W]+", " ");
                string[] a = s.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);
    
                foreach (string i in a)
                {
                    Console.WriteLine(i);
                }
            }
    Chi non cerca trova.

  3. #3
    Umhh ... Mi sembra tanto il testo di un problema scolastico

    Ad ogni modo, puoi risolvere benissimo il problema utilizzando la classe Regex.
    Facci sapere...
    Ciao

    [edit]
    Oopps sono arrivato tardi

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15
    Ma che problemino scolastico, sono io imbranato (sto imparando il java perciò ogni tanto uso anche il C# dato che la sintassi è simile) , scusate se non potevo rispondere ma mi mancava la connessione, comunque vi ringrazio tanto ma avevo già risolto, in ogni caso il metodo split non mi funzionava (cioè in un testo ci possono essere un infinità di caratteri di vario tipo, per esempio ci sono vari tipi di apostrofi, non è che posso scriverli tutti ).

    Ora però ho un altro problema: io ho creato un ciclo che controlla ogni carattere, con tanto di progressbar, in questo modo:

    codice:
    public string delPunteggiatura(DevExpress .XtraEditors.ProgressBarControl  progresso)
    
            {
                progresso.Properties .Maximum  = txt.Length;
                
                bool isEquals = true;
    
                string[] caratteri = new string[] {"a", "b", "c", "d","e", "f", "g", "h", "i",
                
                                                   "l", "m", "n", "o", "p", "q", "r", "s", "t",
                                                     
                                                   "u", "v", "z", "x", "w", "y", "k",
                
                                                    "A", "B", "C", "D","E", "F", "G", "H", "I",
                
                                                   "L", "M", "N", "O", "P", "Q", "R", "S", "T",
                                                     
                                                   "U", "V", "Z", "X", "W", "Y", "K", 
                                                   
                                                   "à", "è", "é", "ì", "ò", "ù", "ç"};
                string finalTxt = "";
    
                for (int i = 0; i < txt.Length; i++)
                   
                {
    
                    
                    
                    isEquals = true;
    
                    string carattereTxt = txt.Substring(i , 1);
    
                    for (int a = 0; a < caratteri.Length; a++)
    
                    {
                        
                        if (carattereTxt != caratteri[a])
                        {
                            isEquals = false;
                        }
    
                        else
                        {
                            isEquals = true;
                            
                            break;
                        }
    
                                                                
                    }
    
                    
                    if (isEquals)
    
                        finalTxt = finalTxt + carattereTxt;
    
                    else
    
                        finalTxt = finalTxt + Environment.NewLine;
                        
                    
                    progresso.Position = i;
                    progresso.Refresh();
    
                    
                }
                
                progresso.Position = progresso.Properties.Maximum;
                
                return finalTxt;
            
            }
    come potete vedere faccio pena, però sono riuscito a ottenere ciò che volevo, ora l'unico problema come dicevo è che essendo molto lento quando deve analizzare molte pagine si "blocca", come posso eseguirlo in un altro thread?

  5. #5
    A parte il fatto che cercherei di semplificare il processo piuttosto che essere costretto ad eseguirlo in un thread separato ..... ad ogni modo visto che è frutto del tuo lavoro cerchiamo di valorizzarlo dandoti comunque la soddisfazione di farlo funzionare a modo tuo.

    codice:
    Private NewThread As Thread
        Delegate Sub Aggiorna(ByVal argValue As Integer)
    
        Private Sub EseguiOperazione()
            NewThread = New Thread(AddressOf _EseguiOperazione)
            NewThread.start
        End Sub
    
        Private Sub _EseguiOperazione()
            'TODO: TUO CODICE
    
            'Aggiorna la progress Bar
            Me.Invoke(New Aggiorna(AddressOf _Aggiorna), ValoreProgressBar)
        End Sub
    
        Private Sub _Aggiorna(ByVal argValue As Integer)
            TuaProgressBar.Value = argValue
        End Sub
    Facci sapere....
    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15
    Jeremy75, il linguaggio è C# non VB.Net

    Io ho pensato più a una cosa del genere:

    codice:
    ParameterizedThreadStart  workerThread = new ParameterizedThreadStart (edit.delPunteggiatura);
    
    Thread thread = new Thread (workerThread);
                    Thread.Start(progressBarControl1);

    Il metodo "delPunteggiatura" ha come parametro esplicito la progressbar, ma ParameterizedThreadStart accetta solo argomenti di tipo object, sai dirmi come posso fare?

  7. #7
    Originariamente inviato da xxtr93
    Jeremy75, il linguaggio è C# non VB.Net
    Non ci avevo fatto caso
    è la classe che contiene il metodo "delPunteggiatura" che ha come parametro esplicito la progressbar, ma ParameterizedThreadStart accetta solo argomenti di tipo object
    Questa non l'ho capita

    Ad ogni modo:
    codice:
    private Thread NewThread;
    public delegate void Aggiorna(int argValue);
    
    private void EseguiOperazione()
    {
    	NewThread = new Thread(_EseguiOperazione);
    	NewThread.start();
    }
    
    private void _EseguiOperazione()
    {
    	//TODO: TUO CODICE
    
    	//Aggiorna la progress Bar
    	this.Invoke(new Aggiorna(_Aggiorna), ValoreProgressBar);
    }
    
    private void _Aggiorna(int argValue)
    {
    	TuaProgressBar.Value = argValue;
    }
    ovviamente devi aggiungere
    codice:
    using System.Threading;
    Facci sapere...
    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15
    Tieni presente che il metodo delPunteggiatura si trova in una classe separata da quella del form (cioè dove si trova il metodo main.)

    Io la richiamo così:

    codice:
    EditTxt.EditTxt edit = new EditTxt.EditTxt(richEditControl1.Text);
    
                    richEditControl1.Text = edit.delPunteggiatura(progressBarControl1);

    Come devo comportarmi? Dove devo inserire tutta quella roba che mi hai scritto tu? Ti prego sii il più chiaro possibile perchè so poco e niente di C#.

  9. #9
    E' ovvio che con l'applicazione strutturata in questo modo .... quando richiami la funzione "delPunteggiatura", il valore di ritorno deve già essere pronto .... altrimenti non avrebbe senso eseguire la procedura in thread separato se poi devi comunque attendere la fine della procedura per recuperarne il valore .... Io non so come è strutturata la tua applicazione .... potresti avviare il thread nel momento in cui crei una nuova istanza della classe, oppure all'avvio dell'applicazione.

    Non credo di riuscire ad essere più chiaro di così ..... bisognerebbe quantomeno capire il motivo per cui hai scelto di scrivere il codice nella classe EditTxt.

    Ma rimango comunque dell'idea che con le RegularExpression si riuscirebbe a fare sicuramente meglio ..... prova a cercare un pò di informazioni in merito e se hai bisogno ...... Facci sapere....
    Ciao

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    15
    OOOOOOOk, risolto alla grande, cioè non sarà un modo di programmare professionale ma i risultati sono ottimi! Ho risolto in questo modo, che a molti farà ridere probabilmente ahahah.

    Ho creato 2 variabili statiche nella classe in cui si trova il metodo per eliminare i caratteri che ottengono i valori per settare una progressbar, io in pratica avvio un nuovo form in un altro thread che tramite un timer aggiorna le progressbar ma il lavoro principale viene eseguito sul thread principale che non avendo più il refresh per le barre ora è veloce il doppio... sono soddisfatto anche se queste variabili essendo public hanno violato l'incapsulamento... spero di essermi spiegato xD Grazie a tutti comunque..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.