2010-09-16 15 views
6

Nel mio programma, ho letto in un file con questa affermazione:È possibile convertire un array di stringhe in una stringa?

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

ma voglio applicare un Regex per il file nel suo complesso (un file di esempio viene mostrato in basso) in modo posso eliminare certa cose di cui non sono interessato nel file. Non riesco a utilizzare ReadAllText perché ho bisogno di leggerlo riga per riga per un altro scopo del programma (rimuovere gli spazi bianchi da ogni riga).

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

(grazie a chiccodoro per questo codice)
Questa è la Regex che voglio applicare.

C'è un modo per ripristinare l'array in un unico file di testo? O qualsiasi altra soluzione al problema?
Le cose che mi vengono in mente sostituiscono le "cose" di cui non mi occupo con string.Empty.

esempio file di

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] 

risposta

3

Sarà davvero difficile usare regexen per gestire i dati multilinea una linea alla volta. Quindi, piuttosto che scherzare, suggerirò di leggerlo prima come una grande stringa, di fare il tuo business regex multi-line, e poi puoi dividerlo in una serie di stringhe usando String.Split (split on ritorni a capo). Il motivo per cui vuoi farlo in questo ordine è che qualsiasi ulteriore operazione sui dati del tuo file includerà le modifiche già apportate dalla regex. Se ti unisci alle stringhe, quindi esegui l'espressione regolare, dovrai dividere nuovamente quella stringa o perdere le modifiche apportate mentre lavori sulla matrice originale.

Ricordate di utilizzare questo per il vostro corrispondenza regex, in modo che abbinerà su più righe:

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

È così divertente, ho appena finito di implementare il codice di join e ho pensato tra me e me" Dio, come diavolo lo dividerò di nuovo in un array? ".. poi ho letto questo.Ha, grazie mille per il tuo aiuto! –

+1

Perché i downvotes? Ho risposto alla domanda vera e propria. – siride

8

È possibile utilizzare String.Join():

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

Se si desidera solo per scrivere di nuovo il file, è possibile utilizzare File.WriteAllLines() e che funziona con una matrice.

+2

È anche possibile utilizzare Environment.NewLine invece di –

+0

@mag Grazie "\ r \ n", incorporato – NullUserException

0

Basta cambiare da

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

a

string allLines = File.ReadAllText(dataFile);

;)

+0

Leggi la mia domanda prima di rispondere! –

+1

Inoltre, si desidera modificare l'espressione regolare in modo che corrisponda a nuove righe: nuovo Regex (@ "CREATE TABLE [^ (] + \ ((. *) \) ON", RegexOptions.SingleLine); – siride

+1

Non è stato richiesto l'OP – quantumSoup

5

String.Join concatenerà tutti i membri della propria matrice utilizzando qualsiasi separatore specificato.

+0

@New Inizio: Non importa se gli elementi numerici nella matrice possono variare. Il separatore è il primo argomento (e può essere il 'String.Empty' se necessario) – 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

È necessario inserire nuovamente i newline ReadAllLines elimina quelli originali –

16

È possibile partecipare a string [] in una singola stringa come questo

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

uscita: - una singola stringa separata.

0

È possibile creare un buffer durante la lettura di ogni riga? Ho l'idea che questo potrebbe essere un po 'più efficiente di ottenere tutte le linee come un array di stringhe, quindi unirle (...anche se non ho fatto uno studio completo del problema e sarei interessato a sentire se c'è qualche ragione per cui è effettivamente più efficiente andare in quel modo).

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(); 
Problemi correlati