elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Top 20 herramientas Hacking más populares de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  ¿Cómo cortar una cadena string separado por espacios?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Cómo cortar una cadena string separado por espacios?  (Leído 4,312 veces)
Meta


Desconectado Desconectado

Mensajes: 3.279



Ver Perfil WWW
¿Cómo cortar una cadena string separado por espacios?
« en: 4 Diciembre 2015, 02:34 am »

Hola:

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

Tengo una variable.

Código
  1. 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
  1. switch (comando)
  2.                {
  3.                    case "1=ON":
  4.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  5.                        Recibidos = "";
  6.                        break;
  7.  
  8.                    case "1=OFF":
  9.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  10.                        Recibidos = "";
  11.                        break;
  12.  
  13.                    case "2=ON":
  14.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  15.                        Recibidos = "";
  16.                        break;
  17.  
  18.                    case "2=OFF":
  19.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  20.                        Recibidos = "";
  21.                        break;
  22.  
  23.                    case "3=ON":
  24.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  25.                        Recibidos = "";
  26.                        break;
  27.  
  28.                    case "3=OFF":
  29.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  30.                        Recibidos = "";
  31.                        break;
  32.  
  33.                    case "4=ON":
  34.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  35.                        Recibidos = "";
  36.                        break;
  37.  
  38.                    case "4=OFF":
  39.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  40.                        Recibidos = "";
  41.                        break;
  42.                }

¿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.


En línea

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


Desconectado Desconectado

Mensajes: 1.038


crack, crack y mas crack...


Ver Perfil WWW
Re: ¿Cómo cortar una cadena string separado por espacios?
« Respuesta #1 en: 4 Diciembre 2015, 04:56 am »

puedes usar el comando split
Código
  1. dim a() as string
  2. a=split("1=ON 2=ON 3=OFF 4=OFF"," ")
  3.  

salu2 Flamer


« Última modificación: 4 Diciembre 2015, 04:57 am por Flamer » En línea

Meta


Desconectado Desconectado

Mensajes: 3.279



Ver Perfil WWW
Re: ¿Cómo cortar una cadena string separado por espacios?
« Respuesta #2 en: 4 Diciembre 2015, 05:49 am »

Buenas:

Lo pusiste en Visual Basic, eejjee.

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

¿Hay que colocarlo así?

Código
  1. string[] a = Recibidos.split("1=ON 2=ON 3=OFF 4=OFF", " ");
  2.  
  3.            switch (Recibidos)
  4.                {
  5.                    case "1=ON":
  6.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  7.                        Recibidos = "";
  8.                        break;
  9.  
  10.                    case "1=OFF":
  11.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  12.                        Recibidos = "";
  13.                        break;
  14.  
  15.                    case "2=ON":
  16.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  17.                        Recibidos = "";
  18.                        break;
  19.  
  20.                    case "2=OFF":
  21.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  22.                        Recibidos = "";
  23.                        break;
  24.  
  25.                    case "3=ON":
  26.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  27.                        Recibidos = "";
  28.                        break;
  29.  
  30.                    case "3=OFF":
  31.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  32.                        Recibidos = "";
  33.                        break;
  34.  
  35.                    case "4=ON":
  36.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  37.                        Recibidos = "";
  38.                        break;
  39.  
  40.                    case "4=OFF":
  41.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  42.                        Recibidos = "";
  43.                        break;
  44.            }

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.
En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.696



Ver Perfil
Re: ¿Cómo cortar una cadena string separado por espacios?
« Respuesta #3 en: 4 Diciembre 2015, 05:54 am »

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
  1. string str = "1=ON 2=ON 3=OFF 4=OFF";
  2. 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

« Última modificación: 4 Diciembre 2015, 06:19 am por Eleкtro » En línea


Meta


Desconectado Desconectado

Mensajes: 3.279



Ver Perfil WWW
Re: ¿Cómo cortar una cadena string separado por espacios?
« Respuesta #4 en: 4 Diciembre 2015, 06:15 am »

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
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO.Ports; // No olvidar.
  12.  
  13. namespace Entrada_Arduino_AWF_3_CS
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        // Utilizaremos un string como buffer de recepción.
  18.        string Recibidos;
  19.  
  20.        public Form1()
  21.        {
  22.            InitializeComponent();
  23.  
  24.            if (!serialPort1.IsOpen)
  25.            {
  26.                try
  27.                {
  28.                    serialPort1.Open();
  29.                }
  30.                catch (System.Exception ex)
  31.                {
  32.                    MessageBox.Show(ex.ToString());
  33.                }
  34.  
  35.                serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
  36.            }
  37.        }
  38.        // Al recibir datos.
  39.        private void Recepcion(object sender, SerialDataReceivedEventArgs e)
  40.        {
  41.            // Acumula los caracteres recibidos a nuestro 'buffer' (string).
  42.            Recibidos += serialPort1.ReadExisting();
  43.  
  44.            // Invocar o llamar al proceso de tramas.
  45.            Invoke(new EventHandler(Actualizar));
  46.        }
  47.  
  48.        // Procesar los datos recibidos en el bufer y extraer tramas completas.
  49.        private void Actualizar(object sender, EventArgs e)
  50.        {
  51.  
  52.            // Asignar el valor de la trama al richTextBox.
  53.            richTextBox1.Text = Recibidos + "\n";
  54.  
  55.            // Selecciona la posición final para leer los mensajes entrantes.
  56.            richTextBox1.SelectionStart = richTextBox1.Text.Length;
  57.  
  58.            // Mantiene el scroll en la entrada de cada mensaje.
  59.            richTextBox1.ScrollToCaret();
  60.  
  61.            char[] delimiterChars = { ' ', '\r', '\n' };
  62.  
  63.            string[] words = Recibidos.Split(delimiterChars);
  64.  
  65.  
  66.            foreach (string Comandos in words)
  67.            {
  68.                switch (Comandos)
  69.                {
  70.                    case "1=ON":
  71.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  72.                        Recibidos = "";
  73.                        break;
  74.  
  75.                    case "1=OFF":
  76.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  77.                        Recibidos = "";
  78.                        break;
  79.  
  80.                    case "2=ON":
  81.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  82.                        Recibidos = "";
  83.                        break;
  84.  
  85.                    case "2=OFF":
  86.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  87.                        Recibidos = "";
  88.                        break;
  89.  
  90.                    case "3=ON":
  91.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  92.                        Recibidos = "";
  93.                        break;
  94.  
  95.                    case "3=OFF":
  96.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  97.                        Recibidos = "";
  98.                        break;
  99.  
  100.                    case "4=ON":
  101.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  102.                        Recibidos = "";
  103.                        break;
  104.  
  105.                    case "4=OFF":
  106.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  107.                        Recibidos = "";
  108.                        break;
  109.            }
  110.          }
  111.        }
  112.  
  113.        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  114.        {
  115.            if (serialPort1.IsOpen) // ¿El puerto está abierto?
  116.            {
  117.                serialPort1.Close(); // Puerto cerrado.
  118.            }
  119.        }
  120.    }
  121. }
  122.  

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.
« Última modificación: 4 Diciembre 2015, 06:34 am por Meta » En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.696



Ver Perfil
Re: ¿Cómo cortar una cadena string separado por espacios?
« Respuesta #5 en: 4 Diciembre 2015, 06:20 am »

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
  1. string str = "1=ON 2=ON 3=OFF 4=OFF";
  2.  
  3. IEnumerable<KeyValuePair<int, bool>> items =
  4.    from token in str.Split()
  5.    select new KeyValuePair<int, bool>(
  6.        Convert.ToInt32(token.Substring(0, token.IndexOf('='))),
  7.        token.Substring(token.IndexOf('=') + 1).Equals("ON", StringComparison.InvariantCultureIgnoreCase) ?
  8.        true : false);
  9.  
  10. foreach (KeyValuePair<int, bool> item in items) {
  11. Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
  12. }

Vb:
Código
  1. Dim str As String = "1=ON 2=ON 3=OFF 4=OFF"
  2.  
  3. Dim items As IEnumerable(Of KeyValuePair(Of Integer, Boolean)) =
  4.    From token As String In str.Split()
  5.    Select New KeyValuePair(Of Integer, Boolean)(
  6.        CInt(token.Substring(0, token.IndexOf("="c))),
  7.        If(token.Substring(token.IndexOf("="c) + 1).Equals("ON", StringComparison.InvariantCultureIgnoreCase),
  8.           True, False))
  9.  
  10. For Each item As KeyValuePair(Of Integer, Boolean) In items
  11.  
  12.    Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value)
  13.  
  14. Next item

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

Código:
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.
« Última modificación: 4 Diciembre 2015, 12:41 pm por Eleкtro » En línea


Meta


Desconectado Desconectado

Mensajes: 3.279



Ver Perfil WWW
Re: ¿Cómo cortar una cadena string separado por espacios?
« Respuesta #6 en: 4 Diciembre 2015, 06:51 am »

Hola:

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

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

Código
  1.                    case "4=OFF":
  2.                        pictureBox4.Image = Properties.Resources.Led_rojo_apagado;
  3.                        richTextBox1.Text += " " + DateTime.Now.ToString();
  4.                        Recibidos = "";
  5.                        break;

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

Debería aparecer al lado como indica abajo.
Citar
1=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
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO.Ports; // No olvidar.
  12.  
  13. namespace Entrada_Arduino_AWF_3_CS
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        // Utilizaremos un string como buffer de recepción.
  18.        string Recibidos;
  19.  
  20.        public Form1()
  21.        {
  22.            InitializeComponent();
  23.  
  24.            if (!serialPort1.IsOpen)
  25.            {
  26.                try
  27.                {
  28.                    serialPort1.Open();
  29.                }
  30.                catch (System.Exception ex)
  31.                {
  32.                    MessageBox.Show(ex.ToString());
  33.                }
  34.  
  35.                serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
  36.            }
  37.        }
  38.        // Al recibir datos.
  39.        private void Recepcion(object sender, SerialDataReceivedEventArgs e)
  40.        {
  41.            // Acumula los caracteres recibidos a nuestro 'buffer' (string).
  42.            Recibidos += serialPort1.ReadExisting();
  43.  
  44.            // Invocar o llamar al proceso de tramas.
  45.            Invoke(new EventHandler(Actualizar));
  46.        }
  47.  
  48.        // Procesar los datos recibidos en el bufer y extraer tramas completas.
  49.        private void Actualizar(object sender, EventArgs e)
  50.        {
  51.  
  52.            // Asignar el valor de la trama al richTextBox.
  53.            richTextBox1.Text += Recibidos;
  54.  
  55.            // Selecciona la posición final para leer los mensajes entrantes.
  56.            richTextBox1.SelectionStart = richTextBox1.Text.Length;
  57.  
  58.            // Mantiene el scroll en la entrada de cada mensaje.
  59.            richTextBox1.ScrollToCaret();
  60.  
  61.            char[] Delimitador = { ' ', '\r', '\n' };
  62.  
  63.            string[] Palabras = Recibidos.Split(Delimitador);
  64.  
  65.  
  66.            foreach (string Comandos in Palabras)
  67.            {
  68.                switch (Comandos)
  69.                {
  70.                    case "1=ON":
  71.                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  72.                        Recibidos = "";
  73.                        break;
  74.  
  75.                    case "1=OFF":
  76.                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  77.                        Recibidos = "";
  78.                        break;
  79.  
  80.                    case "2=ON":
  81.                        pictureBox2.Image = Properties.Resources.Led_rojo_encendido;
  82.                        Recibidos = "";
  83.                        break;
  84.  
  85.                    case "2=OFF":
  86.                        pictureBox2.Image = Properties.Resources.Led_rojo_apagado;
  87.                        Recibidos = "";
  88.                        break;
  89.  
  90.                    case "3=ON":
  91.                        pictureBox3.Image = Properties.Resources.Led_rojo_encendido;
  92.                        Recibidos = "";
  93.                        break;
  94.  
  95.                    case "3=OFF":
  96.                        pictureBox3.Image = Properties.Resources.Led_rojo_apagado;
  97.                        Recibidos = "";
  98.                        break;
  99.  
  100.                    case "4=ON":
  101.                        pictureBox4.Image = Properties.Resources.Led_rojo_encendido;
  102.                        Recibidos = "";
  103.                        break;
  104.  
  105.                    case "4=OFF":
  106.                        pictureBox4.Image = Properties.Resources.Led_rojo_apagado;
  107.                        Recibidos = "";
  108.                        break;
  109.            }
  110.          }
  111.  
  112.            richTextBox1.Text += "        " + DateTime.Now.ToString() + "\r";
  113.        }
  114.  
  115.        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  116.        {
  117.            if (serialPort1.IsOpen) // ¿El puerto está abierto?
  118.            {
  119.                serialPort1.Close(); // Puerto cerrado.
  120.            }
  121.        }
  122.  
  123.        void Actualizar()
  124.        {
  125.            byte[] mBuffer = Encoding.ASCII.GetBytes("ACTUALIZAR"); // Envía comando ACTUALIZAR por el puerto.
  126.            serialPort1.Write(mBuffer, 0, mBuffer.Length);
  127.        }
  128.  
  129.        private void button_Actualizar_Click(object sender, EventArgs e)
  130.        {
  131.            Actualizar();
  132.        }
  133.  
  134.        private void Form1_Load(object sender, EventArgs e)
  135.        {
  136.            Actualizar();
  137.        }
  138.  
  139.        private void button2_Click(object sender, EventArgs e)
  140.        {
  141.            richTextBox1.Clear(); // Limpiar contenido del richTextBox.
  142.            Recibidos = "";
  143.        }
  144.    }
  145. }
  146.  



Saludos.
« Última modificación: 4 Diciembre 2015, 16:01 pm por Meta » En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines