该程序通过将文本文件的某些部分分组为“sections”数组,帮助用户解析文本文件。
所以问题是“是否有任何方法可以找出数组中的行号/位置?”该程序使用foreach循环来读取“sections”数组。
有人可以告知代码吗?谢谢!
namespace Testing
{
class Program
{
static void Main(string[] args)
{
TextReader tr = new StreamReader(@"C:\Test\new.txt");
String SplitBy = "----------------------------------------";
// Skip 5 lines of the original text file
for(var i = 0; i < 5; i++)
{
tr.ReadLine();
}
// Read the reststring
String fullLog = tr.ReadToEnd();
String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);
//String[] lines = sections.Skip(5).ToArray();
int t = 0;
// Tried using foreach (String r in sections.skip(4)) but skips sections instead of the Text lines found within each sections
foreach (String r in sections)
{
Console.WriteLine("The times are : " + t);
// Is there a way to know or get the "r" line number?
Console.WriteLine(r);
Console.WriteLine("============================================================");
t++;
}
}
}
}
答案 0 :(得分:3)
foreach
循环没有任何类型的循环计数器。你可以保留自己的柜台:
int number = 1;
foreach (var element in collection) {
// Do something with element and number,
number++;
}
或者,或许更容易使用LINQ的Enumerable.Select
,它为您提供当前索引:
var numberedElements = collection.Select((element, index) => new { element, index });
numberedElements
是具有属性element
和index
的匿名类型实例的集合。如果是文件,您可以这样做:
var numberedLines = File.ReadLines(filename)
.Select((Line,Number) => new { Line, Number });
的优点是整个事物被懒惰地处理,因此它只会将文件的各个部分读入您实际使用的内存中。
答案 1 :(得分:1)
据我所知,没有办法知道你在文件中的哪个行号。您要么必须自己跟踪这些行,要么再次读取该文件,直到您到达该行并沿途计算。
修改强> 所以你试图在SplitBy分割主字符串后得到数组中字符串的行号? 如果该子字符串中有特定的分隔符,您可以再次将其拆分 - 但是,这可能不会为您提供所需的内容,除了...
你基本上回到了第一个方位。
你可以做的是尝试用换行符分割部分字符串。这应该将其吐出到与字符串内的行号对应的数组中。
答案 2 :(得分:0)
是的,您可以使用for循环而不是foreach。此外,如果您知道文件不会太大,您可以将所有行读入数组:
string[] lines = File.ReadAllLines(@"C:\Test\new.txt");
答案 3 :(得分:0)
好吧,不要使用foreach,使用for循环
for( int i = 0; i < sections.Length; ++ )
{
string section = sections[i];
int lineNum = i + 1;
}
当你使用foreach循环时,你当然可以维护一个计数器,但是没有理由因为你有这个标准的循环,这是为了这种事情。
当然,除非你在Environment.NewLine上拆分,否则这不会必然为你提供文本文件中字符串的行号。你分裂了大量的' - '字符,我不知道你的文件是如何构建的。您可能最终会低估行号,因为所有'---'位都将被丢弃。
答案 4 :(得分:0)
不是你的代码写的。您必须自己跟踪行号。代码中存在问题的区域:
Split
方法,您可能会从原始行集合中“删除”行。你必须知道你已经分了多少分裂,因为它们是行数的原始部分。我建议不要采用你所采用的方法,而是在经典的索引for循环中进行解析和搜索,该循环访问文件的每一行。这可能意味着放弃像Split
这样的便利,而是手动查找文件中的标记,例如{{1}}。 IndexOf
答案 5 :(得分:0)
在阅读了昨天的所有答案之后,我对这些问题有了一个更简单的解决方案。
由于字符串在每一行后面都有换行符,因此可以拆分字符串并将其转换为新数组,然后可以根据数组位置找出行号。
代码:
foreach (String r in sections)
{
Console.WriteLine("The times are : " + t);
IList<String> names = r.Split('\n').ToList<String>();
}