Insertar cadena en una ubicación de cadena específica

Tengo un archivo de texto (.txt) como este

Diálogo: 0,0:00:01.99,0:00:03.84, Predeterminado, 0000,0000,0000, ¡Arriba!

Dialogue: 0,0:00:03.84,0:00:06.31,Default,,0000,0000,0000,,And, again!

Diálogo: 0,0:01:42.92,0:01:44.91, Predeterminado, 0000,0000,0000, Espera un minuto.

Quiero insertar "{" y "}" en ese archivo de esta manera

Diálogo: 0,0:00:01.99,0:00:03.84,Predeterminado,,0000,0000,0000,{¡Arriba!}

Dialogue: 0,0:00:03.84,0:00:06.31,Default,,0000,0000,0000,,{And, again!}

Diálogo: 0,0:01:42.92,0:01:44.91,Predeterminado,,0000,0000,0000,{Espera un minuto.}

Me las arreglé para insertar "}" hasta el último usando este código

            String path = openFileDialog1.FileName;
            List<string> line = new List<string>();
            StreamReader sr = new StreamReader(path);
            StringBuilder sb = new StringBuilder();
            String lines;

            while ((lines = sr.ReadLine()) != null)
            {
                line.Add(lines+"}");
            }

            foreach (string s in line)
            {
                sb.AppendLine(s);
            }

Quiero insertar "{" justo después de "0000," . Lo siento por mi Ing y gracias por su ayuda.

preguntado el 04 de julio de 12 a las 07:07

¿Habrá siempre "0000," en cada línea? -

Sí, MatthewRz. Cada línea en ese texto :D -

@ user1310506, ¿el texto puede contener "0000," alguna vez? -

@ user1310506, quise decir texto después de 0000, ¿puede contener los mismos caracteres? -

5 Respuestas

Suponiendo que su formato incluye 9 secciones delimitadas por comas antes del cuadro de diálogo:

string InsertBrackets(string input)
{
    var idx = -1;
    for (int i = 0; i < 9; i++)
        idx = input.IndexOf(",", idx + 1);

    return input.Insert(idx + 1, "{") + "}";
}

También puede pasar el número de secciones como un parámetro en lugar de codificarlo para que sea 9, si lo desea. Y añadir algo de comprobación de errores, por supuesto.

Respondido 04 Jul 12, 07:07

Exactamente lo que estaba a punto de escribir. - stefan steinegger

        while ((lines = sr.ReadLine()) != null)
        {
           var index = line.LastIndesOf(",,") + 2;
           lines = lines.Insert(index, "{"); 

           line.Add(lines+"}");                
        }   

Respondido 04 Jul 12, 07:07

Fallaría en "¡Y, otra vez!", debido a la coma en el texto. - stefan steinegger

Tienes una coma en la cadena. Creo que la cadena resultante será 1Diálogo: 0,0:00:03.84,0:00:06.31,Predeterminado,,0000,0000,0000,,Y,{¡otra vez!} en lugar del esperado: Ivailo Strandjev

Cambio i little int index = lines.LastIndexOf(","); líneas = líneas. Insertar (índice + 2, "{"); línea.Add(líneas+"}"); - user1310506

Un texto que contenga dos comas (por ejemplo, un error tipográfico u otro tipo de basura) aún lo rompería. - stefan steinegger

Parece una especie de subtítulo.

En ese caso, solo puede contar el número de , te has encontrado. Y el resto son diálogos de texto, que puedes rodear con {}.

No escribo en C#, pero debería haber una función que te permita dividir la cadena por expresión regular. Solo úsalo para dividir a lo largo de las comas ,y especifique un límite para el número de divisiones (en este caso, el número de delimitadores es 9). Luego elige la última ficha para rodear con {}y vuelva a unir la cadena.

Respondido 04 Jul 12, 07:07

Aquí hay un ejemplo de trabajo en idea.

En resumen, esta es la función que agrega las llaves (esta solución depende de que siempre tenga la misma cantidad de campos separados por comas y solo el último campo puede tener comas):

   public static string AddBraces(string u) {
            string[] words = u.Split(',');
            string res = words[0];
            words[9] = "{" + words[9];
            for (int i = 1; i < words.Length;++i) {
                    res = res + ',' + words[i];
            }
            res = res + "}";
            return res;
    }

Respondido 04 Jul 12, 07:07

Suponiendo que siempre tiene dos comas justo antes del texto que le gustaría cambiar (que, según su comentario, parece ser el caso), puede probar algo como esto:

        String str = "Dialogue: 0,0:00:01.99,0:00:03.84,Default,,0000,0000,0000,,Up you go!";
        String newStr = Regex.Replace(str, "(.*,,)(.*)$", "$1{$2}");
        System.Console.WriteLine(str);
        System.Console.WriteLine(newStr);
        System.Console.ReadKey();

Esto produce lo siguiente:

Dialogue: 0,0:00:01.99,0:00:03.84,Default,,0000,0000,0000,,Up you go!
Dialogue: 0,0:00:01.99,0:00:03.84,Default,,0000,0000,0000,,{Up you go!}

Esta expresión regular: (.*,,)(.*)$ emparejará dos grupos. El primer grupo contendrá el inicio de la cadena hasta las dos últimas comas. El segundo grupo contendrá el texto después de las dos últimas comas y seguirá coincidiendo hasta el final de la cadena.

El "$1{$2}" La sección reemplazará la cadena dada con el primer grupo coincidente, seguido de un {, luego seguido por el segundo grupo emparejado que luego es seguido por un }.

Respondido 04 Jul 12, 07:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.