所以这是我的问题,基本上我正在阅读一些关键字(在我的情况下是'#Footer')的大量数据文件之后的最后几行,并且只提取相关数据,我能够提取结束文件,但在阅读多个文件时有问题,
说我有一些示例文件,'testfile00','testfile21','testfile 10'等
请记住,我对任何类型的编程都没有特别的经验,我将如何阅读这些文件并从中提取数据?
到目前为止,我已经获得了以下代码;
static void Main(string[] args)
{
try
{
for (int i = 0; i < 3; i++)
{
string str1 = @"C:\Users\XXXXX\Desktop\testfile";
string str2 = i.ToString();
string str3 = ".datafile";
string final = str1 + str2 + str2 + str3;
var lines = File.ReadLines(final)
.SkipWhile(line => !line.Contains("#Footer"))
.Skip(1)
.ToList();
Console.WriteLine(String.Join(Environment.NewLine, lines));
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
Console.Read();
}
}
我知道使用'str2 + str2'这是错误的,我得到的结果只会读取文件'testfile00','testfile11'和'testfile22',这是我不知道怎么纠正这个获取01,12,20等文件的任何想法?
由于
答案 0 :(得分:1)
我认为更简单的方法是:
foreach (var file in Directory.GetFiles(yourPath, "*.datafile"))
{
var lines = File.ReadLines(file)
.SkipWhile(line => !line.Contains("#Footer"))
.Skip(1)
.ToList();
Console.WriteLine(String.Join(Environment.NewLine, lines));
}
在这种情况下,yourPath
为C:\Users\XXXXX\Desktop\
答案 1 :(得分:0)
您可以使用嵌套循环
try
{
string str1 = @"C:\Users\XXXXX\Desktop\testfile";
string str3 = ".datafile";
for (int i = 0; i < 3; i++)
{
for(int j = 0; j< 3; j++){
string final = str1 + i+ j + str3;
var lines = File.ReadLines(final)
.SkipWhile(line => !line.Contains("#Footer"))
.Skip(1)
.ToList();
Console.WriteLine(String.Join(Environment.NewLine, lines));
}
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
Console.Read();
}
但是,您可能希望在尝试阅读之前确保该文件存在,并且您也可能希望使其更具说明性,因为这通常更容易阅读。 (什么时候搞定语法)。人类的思维很多更好地阅读/理解顺序而不是执行循环的东西
var path = @"C:\Users\XXXXX\Desktop\testfile";
var ext = ".datafile";
var range = Enumerable.Range(0,3);
var filePaths =
from i in range
from j in range
let file = path + i + j+ ext
where File.Exists(file)
select File.ReadLines(f)
.SkipWhile(line => !line.Contains("#Footer"))
.Skip(1);
try{
Console.WriteLine(String.Join(Environment.NewLine,filePaths.SelectMany(f => f));
} catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
Console.Read();
}
编辑从你的评论中可以看出,你所谈论的文件并没有以相应的方式命名,在这种情况下它可能更适合与Michaels answer类似的东西
基本上你需要从上面的LINQ语句中替换前3行
var filePaths =
//This will go through all files in the directory but can be narrowed
//down if needed ie if not all files should be parsed
from i in Directory.GetFiles(path)
//You don't need to test if the files exist any more
select File.ReadLines(f)
.SkipWhile(line => !line.Contains("#Footer"))
.Skip(1);