2010-11-29 4 views
1

Je dispose d'un fichier txt avec le contenuRegEx pour VB.net

$NETS 
P3V3_AUX_LGATE; PQ6.8 PU37.2 
U335_PIN1; R3328.1 U335.1 
$END 

besoin d'être mis à jour dans ce format, et enregistrer de nouveau dans un autre fichier txt

$NETS 
'P3V3_AUX_LGATE'; PQ6.8 PU37.2 
'U335_PIN1'; R3328.1 U335.1 
$END 

REMARQUE: nombre de lignes peut aller jusqu'à 10.000 lignes

Ma solution actuelle est de lire le fichier txt ligne par ligne, détecter la présence du ";" et le caractère de nouvelle ligne et faites les changements.

En ce moment, j'ai une variable qui contient toutes les lignes, est-il autre façon quelque chose comme remplacer par RegEx pour faire les changements sans boucle à travers chaque ligne, de cette façon que je peux facilement imprimer le résultat

et le suivi question, laquelle est la plus efficace?

+0

Dans votre exemple, les lettres, chiffres et traits de soulignement semblent être des caractères valides pour votre chaîne à mettre à jour. Est-ce correct ou pourrait-il y avoir d'autres caractères? –

+1

#, +, -, [,], sont les caractères qui peuvent se trouver n'importe où entre le retour à la ligne et ";" caractères – Aries

Répondre

0

Essayez

ResultString = Regex.Replace(SubjectString, "^([^;\r\n]+);", "'$1';", RegexOptions.Multiline) 

sur votre chaîne multiligne.

Vous trouverez toute chaîne (longueur une ou plusieurs) au début d'une ligne jusqu'au premier point-virgule s'il y en a un et remplacez-la par son équivalent cité.

Il devrait être plus efficace que de boucler la ligne ligne par ligne comme vous le faites maintenant, mais si vous avez un doute, vous devrez le profiler.

+0

merci Tim, va essayer celui-ci et les résultats des résultats – Aries

+0

travailler avec mes fichiers de test actuels, merci – Aries

0

Vous pouvez probablement trouver tous les matches en utilisant quelque chose comme \w+; mais je ne sais pas comment vous pourriez faire un remplacement sur ce en utilisant Regex.Replace pour ajouter le ' s mais garder le match d'origine. Cependant, si vous l'avez déjà en tant que variable, vous n'avez pas besoin de lire à nouveau le fichier, vous pouvez aussi faire en sorte que votre code trouve tous les ; s, puis trouver la nouvelle ligne précédente pour chacun ou utiliser un String.Split sur les nouvelles lignes pour diviser la variable que vous avez déjà en lignes. Et si vous voulez revenir à une variable, vous pouvez simplement utiliser String.Join.

Personnellement, j'utiliserais normalement la méthode String.Split (et éventuellement la méthode String.Join si nécessaire), car je pense que cela faciliterait la lecture du code.

+0

Je vais essayer d'abord les solutions RegEx, merci ho1 – Aries

0

Je dirais que oui! Cela peut être fait avec des expressions régulières. Assurez-vous que l'option "multiligne" est activée et créez votre expression régulière en utilisant des groupes de capture pour faciliter le travail.

Je peux cependant dire que ce ne sera pas le meilleur. Puisque vous mentionnez le nombre de lignes que vous pourriez traiter, il semble plus judicieux d'utiliser une approche de diffusion en continu plutôt que l'approche en mémoire.

Prendre l'approche Regex (et cela a pris 15 minutes si s'il vous plaît ne pense pas que ce soit une solution, juste le prouver travaillerait)

private static Regex matcher = new Regex(@"^\$NETS\r\n(?<entrytitle>.[^;]*);\s*(?<entryrest>.*)\r\n(?<entrytitle2>.[^;]*);\s*(?<entryrest2>.*)\r\n\$END\r\n", RegexOptions.Compiled | RegexOptions.Multiline); 
    static void Main(string[] args) 
    { 
     string newString = matcher.Replace(ExampleFileContent, new MatchEvaluator(evaluator)); 
    } 

    static string evaluator(Match m) 
    { 
     return String.Format("$NETS\r\n'{0}'; {1}\r\n'{2}'; {3}\r\n$END\r\n", 
           m.Groups["entrytitle"].Value, 
           m.Groups["entryrest"].Value, 
           m.Groups["entrytitle2"].Value, 
           m.Groups["entryrest2"].Value);    
    } 

Hope this helps,

+0

merci Marvin, je vais également vérifier sur ce – Aries