¿Cómo puedo usar Regex para obtener valores específicos de un archivo de texto delimitado por,\n?

Tengo un script SQL como el siguiente que se usa para completar una tabla db con algunos datos. Luego estoy leyendo este archivo usando StreamReader en C# en VS2010. Lo que quiero saber es que, una vez que haya leído este archivo como una cadena, ¿cómo puedo dividir cada parámetro individual en una subcadena?

Entonces, idealmente, lo que quiero es leer cada parámetro de VALOR individual en su propia subcadena separada para poder procesar esto.

GUIÓN SQL:

...

INSERT INTO [dbo].[My_Table] ( \n My_ID, \n My_Title, \n My_Message \n ) VALUES ( \n 40, \n 'Hello, This is the message title', \n 'Hello, This is \n the message body' \n )

INSERT INTO [dbo].[My_Table] ( \n My_ID, \n My_Title, \n My_Message \n ) VALUES ( \n 41, \n 'Hello again, This is another message title', \n 'Hello again, This is \n another message body' \n )

Actualmente estoy depurando esto y probando un par de enfoques diferentes, uno usando String.Split() y el otro usando un enfoque Regex.

Aquí está mi código C #:

// this is to find the VALUES parameters in the SQL file
private static readonly Regex matchValues = new Regex(@".*?VALUES.*?\((.*?)\)",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant
|RegexOptions.Singleline);

// fileText is the string object containing the raw text read in from the SQL file
public static string FindMatches(string fileText)
{
    List<Match> matches = matchValues.Matches(fileText).Cast<Match>().ToList();

    foreach (Match match in matches)
    {
         string value = match.Groups[1].Value;
         string pattern = @"^,$";

         // do work

         string[] delimiters = new string[] { ",\n" };

         string[] splitGroup = value.Split(delimiters, StringSplitOptions.None);

         string[] split = Regex.Split(value, pattern);

     }
}

Entonces, si puedo explicar brevemente este código, matchValues ​​Regex me está encontrando los valores para los parámetros de inserción y esto funciona bien. (Tenga en cuenta que actualicé el archivo SQL con \n caracteres para mostrar el diseño del archivo y cómo se almacena en la variable de cadena cuando se lee). Tenga en cuenta que en el valor My_Message puede haber casos ',' y '\n'. Sin embargo, el final de cada parámetro se puede identificar de forma única con ',\n', pero no puedo hacer que esto funcione en Regex y String. Split() solo puede usar 1 carácter.

La lista contiene cada caso para cada coincidencia descubierta, ya que tengo más de 50 entradas en el script SQL, por lo que necesito dividir cada ID, título y mensaje individuales de cada declaración de inserción en 3 variables separadas que están anidadas dentro del bucle.

Actualmente, el objeto de cadena splitGroup[] devuelve demasiadas subcadenas, ya que tenemos nuevas líneas en los valores de los parámetros y el objeto de cadena split[] que utiliza Regex simplemente lo devuelve todo como una sola cadena.

Espero que esta información actualizada sea útil.
Gracias de antemano!

preguntado el 12 de junio de 12 a las 18:06

¿Por qué expresiones regulares y no? string.Split()? -

Hola, @Jeremy, actualicé mi pregunta para que sea un poco más específica y expliqué por qué string.Split() no funciona actualmente para mí. Gracias -

2 Respuestas

Puede configurar RegexOptions para que coincida con los datos de varias líneas, lo que significa que la expresión regular coincidirá con el signo de dólar $ con el final de la línea y no con el final de la cadena. Aquí está el código:

string strRegex = @"^Regex Test";
RegexOptions myRegexOptions = RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"Regex Test for stackoverflow.";

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here
  }
}

Respondido el 12 de junio de 12 a las 18:06

También podrías usar String.Split:

var inserts = File.ReadLines(path)
         .Where(l => l.IndexOf("VALUES (") > -1)
         .Select(l => new
         {
             SQL = l,
             Params = l.Substring(l.IndexOf("VALUES (") + 8)
                       .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
         });
foreach (var insert in inserts)
{
    String sql = insert.SQL;
    String[] parameter = insert.Params;
}

Respondido el 12 de junio de 12 a las 18:06

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