注1:我只有字符串,而不是文件,只有字符串。
我有一个这样的字符串(注意:为了清楚起见,我将包括行号)
行分隔符为\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
找到。
例如,
输入:allText,contents2,“TEXT”
ouput =第7行
另一个样本,
输入:allText,contents1,“TEXT”
ouput =第3行
另一个样本,
输入:allText,contents1,“TEXT NOT FOUND”
ouput =行号-1
如何实现此功能?
提前致谢。
答案 0 :(得分:1)
你的问题很混乱,但我认为我得到了它的要点。我会编辑这个问题,但我没有代表这样做。
总结一下,你有一个包含多个文件内容的字符串。您想知道较大主文件中某个文件的特定文本位的索引。
当找不到文本时,这将返回-1。我还假设你的字符串中的行由平台默认值(Windows上的\ 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);
}
}