2010-06-04 2 views
0

Я пробую объяснить свою проблему:манипулировать строками, искать текст

примечание 1: У меня есть только строки, а не файлы, ТОЛЬКО строки.

У меня есть строка, как это (Примечание: я включаю номера строк для лучшего объяснения)

Изолятор линии \ г \ п (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 == 

У меня есть содержимое строк, как это:

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

Lorem ipsum TEXT Lorem ipsum 

== END 001partXXX.sql == 

другое содержимое строки:

string contents2 = 

== START 002partzzz.sql == 

Lorem ipsum TEXT Lorem ipsum 

== END 002partzzz.sql == 
!

Затем

allText.IndexOf (contents1) = -1

allText.IndexOf (contents2) = -1

мне нужны функции Thats получить 3 параметра: allText, содержание и текст, чтобы найти в содержании, и он возвращает номер строки текста, чтобы найти в AllText

Например,

вход: allText, contents2, «TEXT "

Ouput = номер строки 7

Другой образец,

вход: allText, contents1, "Текст"

Ouput = номер строки 3

другой образец,

вход: allText, contents1, "ТЕКСТ НЕ НАЙДЕНО"

Ouput = номер строки -1

Как я могу реализовать эту функцию ?? любая помощь очень полезна для меня,

Спасибо в продвинутом виде.

+0

Что происходит, когда TextToFind не найден? Кроме того, ваши линии, как они разделены? \ r, \ r \ n или \ n? –

+0

Я использую только файлы, чтобы выровнять строки, переданные функции. Сама функция имеет дело только со строками. –

ответ

1

Ваш вопрос довольно запутанный, но я думаю, что я получил его суть. Я бы отредактировал этот вопрос, но у меня нет представителя.

Чтобы сделать вывод, у вас есть строка, содержащая содержимое нескольких файлов. Вы хотите знать индекс определенного бита текста из одного из отдельных файлов в более крупном главном файле.

Это вернет -1, когда текст не будет найден. Я также предполагаю, что строки в ваших строках разделены тем, что по умолчанию используется платформой (\ r \ n на окнах).

Надеюсь, это ответит на ваш вопрос.

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); 
    } 
} 
Смежные вопросы