2010-09-16 3 views
6

Dans mon programme, j'ai lu dans un fichier en utilisant cette déclaration:Est-il possible de convertir un tableau de chaînes en une seule chaîne?

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

Mais je veux appliquer un Regex au dossier dans son ensemble (un exemple de fichier est affiché en bas) pour que je puisse éliminer certains des choses que je ne suis pas concerné par le fichier. Je ne peux pas utiliser ReadAllText car j'ai besoin de le lire ligne par ligne pour un autre but du programme (enlever les espaces de chaque ligne).

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

(grâce à chiccodoro pour ce code)
C'est le Regex que je veux appliquer.

Y a-t-il un moyen de changer le tableau en un fichier texte? Ou toute autre solution au problème?
Les choses qui me viennent à l'esprit sont de remplacer le «truc» qui ne me concerne pas string.Empty.

exemple de fichier

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] 

Répondre

3

Il sera très difficile d'utiliser regexen pour gérer les données multi-lignes ligne par ligne. Donc, plutôt que de muck à propos de cela, je vais suggérer que vous l'avez d'abord lu comme une grande chaîne, faites votre métier regex multi-ligne, et ensuite vous pouvez le diviser en un tableau de chaînes en utilisant String.Split (split on nouvelles lignes). La raison pour laquelle vous voulez le faire dans cet ordre est que toute opération supplémentaire sur vos données de fichier inclura les changements déjà effectués par l'expression régulière. Si vous joignez les chaînes, alors faites l'expression régulière, vous devrez soit scinder cette chaîne encore, ou perdre les changements que vous avez faits pendant que vous opérez sur le tableau original.

Rappelez-vous de l'utiliser pour votre correspondance des expressions rationnelles, afin qu'il corresponde à travers les nouvelles lignes:

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

C'est tellement drôle que je venais juste de terminer l'implémentation du code de jointure et je me suis dit" Dieu, comment le qu'est-ce que je vais diviser en arrière dans un tableau? ".. alors je lis ceci Ha, merci beaucoup pour votre aide! –

+1

Pourquoi les downvotes? J'ai répondu à la question réelle. – siride

8

Vous pouvez utiliser String.Join():

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

Si vous voulez juste l'écrire dans le fichier, vous pouvez utiliser File.WriteAllLines() et qui fonctionne avec un tableau.

+2

Vous pouvez également utiliser Environment.NewLine au lieu de "\ r \ n" –

+0

@mag Merci, incorporé – NullUserException

0

il suffit de changer de

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

à

string allLines = File.ReadAllText(dataFile);

;)

+0

Lire ma question avant de répondre! –

+1

Vous souhaitez également modifier l'expression régulière pour qu'elle corresponde aux nouvelles lignes: new Regex (@ "CREATE TABLE [^ (] + \ ((* *) \) ON", RegexOptions.SingleLine); – siride

+1

Pas ce que l'OP a demandé – quantumSoup

5

String.Join concaténera tous les membres de votre tableau en utilisant une seperator spécifiée.

+0

@New Start: Peu importe si les éléments de nombre dans le tableau peuvent varier.Le séparateur est le premier argument (et peut être le 'String.Empty' si nécessaire.) – 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

Vous devez aussi remettre les retours à la ligne, ReadAllLines rejette les lignes d'origine –

16

Vous pouvez joindre string [] en une seule chaîne comme celui-ci

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

sortie: - une seule chaîne séparée.

0

Pourriez-vous créer un tampon lorsque vous lisez dans chaque ligne? J'ai l'idée que cela pourrait être un peu plus efficace que d'obtenir toutes les lignes en tant que tableau de chaînes, puis de les rejoindre (...bien que je n'ai pas fait une étude complète de la question et serais intéressé d'entendre s'il y a une raison pour laquelle il est effectivement plus efficace d'aller de cette façon).

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(); 
Questions connexes