2010-09-16 23 views
6

En mi programa, leí en un archivo mediante esta declaración:¿Es posible convertir una matriz de cadenas en una cadena?

string[] allLines = File.ReadAllLines(dataFile); 

Pero quiero aplicar una expresión regular en el fichero en su conjunto (un archivo de ejemplo se muestra en la parte inferior), así que puede eliminar cierta cosas que no me preocupan en el archivo. No puedo usar ReadAllText porque necesito leerlo línea por línea para otro propósito del programa (eliminar espacios en blanco de cada línea).

Regex r = new Regex(@"CREATE TABLE [^\(]+\((.*)\) ON"); 

(gracias a chiccodoro para este código)
Esta es la expresión regular que quiero aplicar.

¿Hay alguna manera de volver a convertir la matriz en un archivo de texto? ¿O alguna otra solución al problema?
Las cosas que me vienen a la mente son reemplazar las 'cosas' que no me interesan con string.Empty.

ejemplo de archivo

USE [Shelleys Other Database] 
CREATE TABLE db.exmpcustomers(
    f_name varchar(100) NULL, 
    l_name varchar(100) NULL, 
    date_of_birth date NULL, 
    house_number int NULL, 
    street_name varchar(100) NULL 
) ON [PRIMARY] 

Respuesta

3

Va a ser realmente difícil usar regexen para tratar datos de varias líneas una línea a la vez. Entonces, en lugar de fastidiarme con eso, voy a sugerir que primero lo lean como una gran cadena, hagan su negocio de expresiones regulares multilínea, y luego pueden dividirlo en una serie de cadenas usando String.Split (dividir nuevas líneas). La razón por la que desea hacerlo en este orden es para que cualquier operación adicional en sus datos de archivo incluya los cambios ya realizados por la expresión regular. Si se une a las cadenas, luego realice la expresión regular, tendrá que dividir esa cadena nuevamente o perder los cambios que haya realizado mientras opera en la matriz original.

recuerde usar esto para su coincidencia de expresiones regulares, por lo que coincidirá través de saltos de línea:

Regex r = new Regex(@"CREATE TABLE [^(]+((.*)) ON", RegexOptions.SingleLine); 
+0

es tan divertido, que acababa de terminar la ejecución del código de unirse y pensé: "Dios, cómo el. demonios voy a dividir de nuevo en una matriz?" .. luego leí esto. Ha, muchas gracias por su ayuda! –

+1

¿por qué los downvotes? me respondieron a la pregunta real. – siride

8

Puede utilizar String.Join():

string joined = String.Join(Environment.NewLine, allLines); 

Si lo que desea es escribir de nuevo al archivo, puede utilizar File.WriteAllLines() y que trabaja con una matriz.

+2

También puede utilizar Environment.NewLine en lugar de "\ r \ n" –

+0

@mag Gracias, incorporada – NullUserException

0

acaba de cambiar de

string[] allLines = File.ReadAllLines(dataFile);

a

string allLines = File.ReadAllText(dataFile);

;)

+0

Leer mi pregunta antes de contestar! –

+1

También desea cambiar la expresión regular para que coincida con saltos de línea: nuevo Regex (@ "CREATE TABLE [^ (] + \ ((*) \) en ON.", RegexOptions.SingleLine); – siride

+1

No lo que solicitó a la OP para – quantumSoup

5

String.Join concatena todos los miembros de la matriz utilizando cualquier separador especificado.

+0

@New de inicio:!. no importa si los elementos numéricos de la matriz pueden variar el separador es el primer argumento (y puede ser el 'String.Empty' si es necesario) – Brian

0
public string CreateStringFromArray(string[] allLines) 
{   
StringBuilder builder = new StringBuilder(); 
     foreach (string item in allLines) 
     { 
      builder.Append(item); 
      //Appending Linebreaks 
      builder.Append("\n\l"); 
     } 
     return builder.ToString(); 
} 
+0

es necesario poner los saltos de línea de nuevo, también;. ReadAllLines descarta los originales –

16

Usted puede unirse a la cadena [] en una sola cadena como esta

string strmessage=string.join(",",allLines); 

de salida: - una única cuerda separada.

0

¿Podría construir un búfer mientras lee en cada línea? Tengo la idea de que esto podría ser un poco más eficiente que obtener todas las líneas como un conjunto de cadenas, y luego unirlas (...aunque no he hecho un estudio completo de la edición y estaría interesado en saber si hay alguna razón que en realidad es más eficiente que ir de esa manera).

StringBuilder buffer = new StringBuilder(); 
string line = null; 
using (StreamReader sr = new StreamReader(dataFile)) 
{ 
    while((line = sr.ReadLine()) != null) 
    { 
     // Do whatever you need to do with the individual line... 
     // ...then append the line to your buffer. 
     buffer.Append(line); 
    } 
} 
// Now, you can do whatever you need to do with the contents of 
// the buffer. 
string wholeText = buffer.ToString(); 
Cuestiones relacionadas