2010-06-04 6 views
0

J'essaie d'expliquer mon problème:manipuler des chaînes, texte de recherche

note 1: J'ai seulement des chaînes, pas de fichiers, SEULEMENT des chaînes.

J'ai une chaîne comme celui-ci (REMARQUE: j'inclure les numéros de ligne pour mieux expliquer)

Le séparateur de ligne est \ r \ n (CRLF)

string allText = 

1 Lorem ipsum Lorem ipsum 

2 == START 001partXXX.sql == 

3 Lorem ipsum TEXT Lorem ipsum 

4 == END 001partXXX.sql == 

5 Lorem ipsum TEXT Lorem ipsum 

6 == START 002partzzz.sql == 

7 Lorem ipsum TEXT Lorem ipsum 

8 == END 002partzzz.sql == 

J'ai contenu des chaînes comme ceci:

string contents1 = 
== START 001partXXX.sql == 

Lorem ipsum TEXT Lorem ipsum 

== END 001partXXX.sql == 

l'autre chaîne de contenu:

string contents2 = 

== START 002partzzz.sql == 

Lorem ipsum TEXT Lorem ipsum 

== END 002partzzz.sql == 
!

Puis,

allText.IndexOf (de MATIÈRES1) = -1

allText.IndexOf (contents2) = -1

j'ai besoin thats fonction de réception 3 paramètres: AllText, le contenu et texte à trouver dans le contenu, et il renvoie le numéro de la ligne de texte à trouver dans AllText

Par exemple,

entrée

: AllText, contents2, « TEXT "

ouput = ligne numéro 7

Un autre échantillon,

entrée

: AllText, MATIÈRES1, "TEXTE"

ouput = numéro de la ligne 3

autre échantillon,

entrée: AllText, MATIÈRES1, "TEXT INTROUVABLE"

ouput = numéro de ligne -1

Comment puis-je mettre en œuvre cette fonction ?? toute aide très utile pour moi,

Merci à l'avance.

+0

Que se passe-t-il lorsque TextToFind est introuvable? Aussi, vos lignes, comment sont-elles séparées? \ r, \ r \ n ou \ n? –

+0

J'utilise seulement les fichiers comme un moyen de graine les chaînes passées à la fonction. La fonction elle-même ne traite que des chaînes. –

Répondre

1

Votre question est assez confuse, mais je pense que j'ai compris l'essentiel. Je modifierais la question, mais je n'ai pas le représentant pour le faire.

Pour récapituler, vous disposez d'une chaîne contenant le contenu de plusieurs fichiers. Vous voulez connaître l'index d'un morceau particulier de texte d'un des fichiers individuels dans le fichier principal plus grand.

Cela retournera -1 lorsque le texte est introuvable. Je suppose également que les lignes de vos chaînes sont séparées par la valeur par défaut de la plate-forme (\ r \ n sous Windows).

Espérons que cela répond à votre question.Que se passe-t-il lorsque TextToFind est introuvable?

using System; 
using System.Collections.Generic; 
using System.IO; 

public class MyClass 
{ 
    public static void Main() 
    { 
     //read relevant text from disk 
     string AllText = File.ReadAllText(@"c:\alltext.txt"); 
     string Contents = File.ReadAllText(@"c:\contents.txt"); 
     string text = "TEXT"; 

     int line = SearchForLine(AllText, Contents, text); 

     Console.WriteLine(line); 
     Console.Write("Press any key to continue..."); 
     Console.ReadKey(); 
    } 

    static int SearchForLine(string AllText, string Contents, string SearchText) 
    { 
     //split strings into arrays based on newline character 
     //uses environment.newline (\r\n on windows). change to what you 
     //need if this isn't correct 
     string[] AllTextSplit = SplitStringOnNewLine(AllText); 
     string[] ContentsSplit = SplitStringOnNewLine(Contents); 

     //find the first line of Contents in AllText 
     int start = FindIndex(AllTextSplit, ContentsSplit[0]); 
     //find the last line of Contents in AllText 
     int stop = FindIndex(AllTextSplit, ContentsSplit[ContentsSplit.Length - 1]); 

     //search alltext for SearchText between start and stop (lines where contents exist in AllText 
     for (int i = start; i <= stop; i++) 
     { 
      if (AllTextSplit[i].IndexOf(SearchText)!=-1) 
      { 
       return i + 1; // + 1 because you want line numbers starting at 1 
      } 
     } 
     return -1; 
    } 

    private static int FindIndex(string[] TextToSearch, string SearchText) 
    { 
     for (int i = 0; i < TextToSearch.Length; i++) 
     { 
      if (TextToSearch[i] == SearchText) 
      { 
       return i; 
      } 
     } 
     return -1; 
    } 
    private static string[] SplitStringOnNewLine(string StringToSplit) 
    { 
     return StringToSplit.Split(new string[] { Environment.NewLine }, 
         StringSplitOptions.None); 
    } 
} 
Questions connexes