манипулирование строками, поиск текста - PullRequest
0 голосов
/ 04 июня 2010

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

У меня есть такая строка (ПРИМЕЧАНИЕ: для ясности я добавлю номера строк)

Разделитель строкis \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 ==

У меня есть contents строки, подобные этой:

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

Lorem ipsum TEXT Lorem ipsum

== END 001partXXX.sql ==

Другая строка contents:

string contents2 =

== START 002partzzz.sql ==

Lorem ipsum TEXT Lorem ipsum

== END 002partzzz.sql ==

Затем

allText.IndexOf(contents1) != -1

allText.IndexOf(contents2) != -1

Мне нужна функция, которая получает 3 параметра: allText, Contents и text для поиска в contents, и возвращает номер строки Text для поискав AllText.

Например,

input: allText, contents2, "TEXT"

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

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

Вход: allText, contents1, "TEXT"

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

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

input: allText, contents1, "TEXT NOT FOUND"

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

Как реализовать эту функцию?

Заранее спасибо.

1 Ответ

1 голос
/ 04 июня 2010

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

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

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

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

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...