¿Cómo cortar una cadena string separado por espacios?

Iniciado por Meta, 4 Diciembre 2015, 02:34 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hola:

Mirando aquí y todo,  no me entero de lo que quiero hacer.

Tengo una variable.

Código (csharp) [Seleccionar]
string Recibidos;

En su interior se almacena esta cadena.

1=ON 2=ON 3=OFF 4=OFF

Como pueden ver, hay espacios por medio. Por ejemplo, para que me tenga que ejecutar el schitch, necesito lo que indica abajo, no toda la cadena en uno.

Código (csharp) [Seleccionar]
switch (comando)
                {
                    case "1=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "1=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "2=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "2=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "3=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "3=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "4=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "4=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;
                }


¿Qué puedo hacer para que me ejecuta los comandos del switch cuando me llegue en al variable Recibidos una cadena de carácteres?

Cortar. Decirlo es fácil. Algún truco que no complique más el código????????

Bueno, si lo complica no pasa nada, mientras funcione.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Flamer

#1
puedes usar el comando split
Código (vbnet) [Seleccionar]

dim a() as string
a=split("1=ON 2=ON 3=OFF 4=OFF"," ")


salu2 Flamer

Meta

Buenas:

Lo pusiste en Visual Basic, eejjee.

Código (csharp) [Seleccionar]
string[] a = null;
a = Strings.split("1=ON 2=ON 3=OFF 4=OFF", " ");


¿Hay que colocarlo así?

Código (csharp) [Seleccionar]
string[] a = Recibidos.split("1=ON 2=ON 3=OFF 4=OFF", " ");

            switch (Recibidos)
                {
                    case "1=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "1=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "2=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "2=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "3=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "3=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "4=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "4=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;
            }


Al compilar me dice este error.

Gravedad   Código   Descripción   Proyecto   Archivo   Línea
Error   CS1061   'string' no contiene una definición para 'split' ni se encuentra ningún método de extensión 'split' que acepte un primer argumento del tipo 'string' (¿falta alguna directiva using o una referencia de ensamblado?)   Entrada_Arduino_AWF_3_CS   C:\Users\Usuario\Documents\Visual Studio 2015\Projects\Entrada_Arduino_AWF_3_CS\Entrada_Arduino_AWF_3_CS\Form1.cs   61


Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#3
Citar¿Cómo cortar una cadena string separado por espacios?

El overload por defecto de la extensión String.Split de por si ya parte o corta la cadena mediante espacios en blanco (y caracteres nulos). No necesitas asignarle ningún parámetro en este caso.

Tan simple como esto:
Código (csharp) [Seleccionar]
string str = "1=ON 2=ON 3=OFF 4=OFF";
string[] tokens = str.Split();





El último switch que has mostrado sería incorrecto. Tienes que evaluar cada item del array.

Aparte de eso, estás intentando utilizar el método Split del namespace VisualBasic que te mostró @Flamer (pero si no importas el namespace Microsoft.VisualBasic entonces no lo vas a poder utilizar), no hay ningún overload de la extensión String.Split que tome los argumentos que intentas pasarle. Pero sobre esto ya te acabo de mostrar un código de ejemplo.

Saludos









Meta

#4
Hola:

Buscando el trozo de código llegué  aesta Web.

https://msdn.microsoft.com/es-es/library/ms228388.aspx?f=255&MSPPError=-2147217396

Hice el código completo y compila, pero con peros.
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO.Ports; // No olvidar.

namespace Entrada_Arduino_AWF_3_CS
{
    public partial class Form1 : Form
    {
        // Utilizaremos un string como buffer de recepción.
        string Recibidos;

        public Form1()
        {
            InitializeComponent();

            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }

                serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
            }
        }
        // Al recibir datos.
        private void Recepcion(object sender, SerialDataReceivedEventArgs e)
        {
            // Acumula los caracteres recibidos a nuestro 'buffer' (string).
            Recibidos += serialPort1.ReadExisting();

            // Invocar o llamar al proceso de tramas.
            Invoke(new EventHandler(Actualizar));
        }

        // Procesar los datos recibidos en el bufer y extraer tramas completas.
        private void Actualizar(object sender, EventArgs e)
        {

            // Asignar el valor de la trama al richTextBox.
            richTextBox1.Text = Recibidos + "\n";

            // Selecciona la posición final para leer los mensajes entrantes.
            richTextBox1.SelectionStart = richTextBox1.Text.Length;

            // Mantiene el scroll en la entrada de cada mensaje.
            richTextBox1.ScrollToCaret();

            char[] delimiterChars = { ' ', '\r', '\n' };

            string[] words = Recibidos.Split(delimiterChars);


            foreach (string Comandos in words)
            {
                switch (Comandos)
                {
                    case "1=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "1=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "2=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "2=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "3=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "3=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "4=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "4=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;
            }
          }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) // ¿El puerto está abierto?
            {
                serialPort1.Close(); // Puerto cerrado.
            }
        }
    }
}


Por fin entra en el switch, lo curioso que a partir del segundo case, se comporta que lo ejecuta, en realidad no se activa los led, solo el primero.

Saludos.


Edito:
Me dicuanta que en los pictureBos tenía los mismo y cada uno tiene que ser 2, 3 y 4, ahora me funciona todo.

Gracias por la ayuda.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#5
Para empezar son 4 elementos distintos (1=..., 2=..., 3=..., 4=...) que pueden tener dos valores distintos (ON, OFF), pero en tu switch estás evaluando mucho más que dos valores por cada elemento. Piensa en ello y también considera utilizar un elseif. El último código que has mostrado es facilmente adaptable/corregible, solo debes eliminar la parte "número=" de cada item mediante un split('=') o un substring, y posteriormente evaluar en tu switch si el string es "ON" u "OFF" (no "número=ON" ni "número=OFF").

De todas formas, tienes un string que es facilmente delimitable y convertible a otro tipo de objeto administrado con el que poder trabajar mejor, sácale provecho a eso en lugar de seguir con la metodología de la manipulación y evaluación de strings.

Yo lo haría de la siguiente manera, convirtiendo la cadena de texto deliminatada a una colección de enteros y booleanos para una mejor evaluación de cada valor:

C#:
Código (csharp) [Seleccionar]
string str = "1=ON 2=ON 3=OFF 4=OFF";

IEnumerable<KeyValuePair<int, bool>> items =
   from token in str.Split()
   select new KeyValuePair<int, bool>(
       Convert.ToInt32(token.Substring(0, token.IndexOf('='))),
       token.Substring(token.IndexOf('=') + 1).Equals("ON", StringComparison.InvariantCultureIgnoreCase) ?
       true : false);

foreach (KeyValuePair<int, bool> item in items) {
Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}


Vb:
Código (vbnet) [Seleccionar]
Dim str As String = "1=ON 2=ON 3=OFF 4=OFF"

Dim items As IEnumerable(Of KeyValuePair(Of Integer, Boolean)) =
   From token As String In str.Split()
   Select New KeyValuePair(Of Integer, Boolean)(
       CInt(token.Substring(0, token.IndexOf("="c))),
       If(token.Substring(token.IndexOf("="c) + 1).Equals("ON", StringComparison.InvariantCultureIgnoreCase),
          True, False))

For Each item As KeyValuePair(Of Integer, Boolean) In items

   Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value)

Next item


En la colección de llaves o diccionario items tendrías cada parte del string representada de la siguiente manera (ïndice, Booleano):

Key: 1, Value: True
Key: 2, Value: True
Key: 3, Value: False
Key: 4, Value: False


Con cada llave harias un switch o un if/elseif para evaluar el valor booleano.

Saludos.








Meta

#6
Hola:

Vaya, tu código es mucho más corto.

He intentado poner la hora y fecha en los dos últimos case.

Código (csharp) [Seleccionar]
                   case "4=OFF":
                       pictureBox4.Image = Properties.Resources.Led_rojo_apagado;
                       richTextBox1.Text += " " + DateTime.Now.ToString();
                       Recibidos = "";
                       break;


El resultado me da esto:
Citar1=OFF 2=ON 3=OFF 4=OFF
04/12/2015 5:53:25

Debería aparecer al lado como indica abajo.
Citar1=OFF 2=ON 3=OFF 4=OFF 04/12/2015 5:53:25

No encuentro como hacerlo, no veo porqué sale abajo.

Por cierto, voy a probar tu código que es más corto yy tienes razón del manejo del "número=".

Saludos.


Edito:

Ya me sale pero a veces con fallos de datos en el richtextbox.

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO.Ports; // No olvidar.

namespace Entrada_Arduino_AWF_3_CS
{
   public partial class Form1 : Form
   {
       // Utilizaremos un string como buffer de recepción.
       string Recibidos;

       public Form1()
       {
           InitializeComponent();

           if (!serialPort1.IsOpen)
           {
               try
               {
                   serialPort1.Open();
               }
               catch (System.Exception ex)
               {
                   MessageBox.Show(ex.ToString());
               }

               serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
           }
       }
       // Al recibir datos.
       private void Recepcion(object sender, SerialDataReceivedEventArgs e)
       {
           // Acumula los caracteres recibidos a nuestro 'buffer' (string).
           Recibidos += serialPort1.ReadExisting();

           // Invocar o llamar al proceso de tramas.
           Invoke(new EventHandler(Actualizar));
       }

       // Procesar los datos recibidos en el bufer y extraer tramas completas.
       private void Actualizar(object sender, EventArgs e)
       {

           // Asignar el valor de la trama al richTextBox.
           richTextBox1.Text += Recibidos;

           // Selecciona la posición final para leer los mensajes entrantes.
           richTextBox1.SelectionStart = richTextBox1.Text.Length;

           // Mantiene el scroll en la entrada de cada mensaje.
           richTextBox1.ScrollToCaret();

           char[] Delimitador = { ' ', '\r', '\n' };

           string[] Palabras = Recibidos.Split(Delimitador);


           foreach (string Comandos in Palabras)
           {
               switch (Comandos)
               {
                   case "1=ON":
                       pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                       Recibidos = "";
                       break;

                   case "1=OFF":
                       pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                       Recibidos = "";
                       break;

                   case "2=ON":
                       pictureBox2.Image = Properties.Resources.Led_rojo_encendido;
                       Recibidos = "";
                       break;

                   case "2=OFF":
                       pictureBox2.Image = Properties.Resources.Led_rojo_apagado;
                       Recibidos = "";
                       break;

                   case "3=ON":
                       pictureBox3.Image = Properties.Resources.Led_rojo_encendido;
                       Recibidos = "";
                       break;

                   case "3=OFF":
                       pictureBox3.Image = Properties.Resources.Led_rojo_apagado;
                       Recibidos = "";
                       break;

                   case "4=ON":
                       pictureBox4.Image = Properties.Resources.Led_rojo_encendido;
                       Recibidos = "";
                       break;

                   case "4=OFF":
                       pictureBox4.Image = Properties.Resources.Led_rojo_apagado;
                       Recibidos = "";
                       break;
           }
         }

           richTextBox1.Text += "        " + DateTime.Now.ToString() + "\r";
       }

       private void Form1_FormClosing(object sender, FormClosingEventArgs e)
       {
           if (serialPort1.IsOpen) // ¿El puerto está abierto?
           {
               serialPort1.Close(); // Puerto cerrado.
           }
       }

       void Actualizar()
       {
           byte[] mBuffer = Encoding.ASCII.GetBytes("ACTUALIZAR"); // Envía comando ACTUALIZAR por el puerto.
           serialPort1.Write(mBuffer, 0, mBuffer.Length);
       }

       private void button_Actualizar_Click(object sender, EventArgs e)
       {
           Actualizar();
       }

       private void Form1_Load(object sender, EventArgs e)
       {
           Actualizar();
       }

       private void button2_Click(object sender, EventArgs e)
       {
           richTextBox1.Clear(); // Limpiar contenido del richTextBox.
           Recibidos = "";
       }
   }
}




Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/