Autor
|
Tema: ¿Cómo cortar una cadena string separado por espacios? (Leído 6,073 veces)
|
Meta
|
Hola: Mirando aquí y todo, no me entero de lo que quiero hacer. Tengo una variable. 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. 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.
|
|
|
En línea
|
|
|
|
Flamer
Desconectado
Mensajes: 1.052
crack, crack y mas crack...
|
puedes usar el comando split dim a() as string a=split("1=ON 2=ON 3=OFF 4=OFF"," ")
salu2 Flamer
|
|
« Última modificación: 4 Diciembre 2015, 04:57 am por Flamer »
|
En línea
|
|
|
|
Meta
|
Buenas: Lo pusiste en Visual Basic, eejjee. string[] a = null; a = Strings.split("1=ON 2=ON 3=OFF 4=OFF", " ");
¿Hay que colocarlo así? 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.
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.891
|
¿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: 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
|
|
« Última modificación: 4 Diciembre 2015, 06:19 am por Eleкtro »
|
En línea
|
|
|
|
Meta
|
Hola: Buscando el trozo de código llegué aesta Web. https://msdn.microsoft.com/es-es/library/ms228388.aspx?f=255&MSPPError=-2147217396Hice el código completo y compila, pero con peros. 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.
|
|
« Última modificación: 4 Diciembre 2015, 06:34 am por Meta »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.891
|
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#: 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: 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.
|
|
« Última modificación: 4 Diciembre 2015, 12:41 pm por Eleкtro »
|
En línea
|
|
|
|
Meta
|
Hola: Vaya, tu código es mucho más corto. He intentado poner la hora y fecha en los dos últimos case. case "4=OFF": pictureBox4.Image = Properties.Resources.Led_rojo_apagado; richTextBox1.Text += " " + DateTime.Now.ToString(); Recibidos = ""; break;
El resultado me da esto: 1=OFF 2=ON 3=OFF 4=OFF 04/12/2015 5:53:25 Debería aparecer al lado como indica abajo. 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. 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.
|
|
« Última modificación: 4 Diciembre 2015, 16:01 pm por Meta »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
AYUDA. Quiero saber como cortar una cadena hasta un identificador.
Programación Visual Basic
|
el_trocha
|
3
|
5,981
|
16 Septiembre 2007, 12:00 pm
por el_trocha
|
|
|
como adicionar espacios en una cadena de texto?
Programación Visual Basic
|
byway
|
8
|
4,953
|
17 Noviembre 2011, 22:59 pm
por x64core
|
|
|
Como quitar los espacios al inicio y al final de una cadena
Programación C/C++
|
pefo
|
3
|
3,047
|
14 Noviembre 2012, 15:33 pm
por djimenez39
|
|
|
[C++] ¿Cómo me puede leer un cin de una cadena de texto sin contar espacios?
Programación C/C++
|
DeIMachine
|
2
|
2,782
|
17 Enero 2016, 20:20 pm
por DeIMachine
|
|
|
Cadena string (Direccion con espacios error)
.NET (C#, VB.NET, ASP)
|
rigorvzla
|
6
|
4,598
|
28 Diciembre 2017, 15:53 pm
por rigorvzla
|
|