C# 尝试使用linq查询同一文件夹中的多个文本文件
我需要搜索包含csv文件的文件夹。我感兴趣的记录有3个字段:Rec、Country和Year。我的工作是搜索这些文件,看看其中是否有超过一年的记录。以下是我目前掌握的代码: //从文件夹中获取每个单独的文件C# 尝试使用linq查询同一文件夹中的多个文本文件,c#,linq,csv,C#,Linq,Csv,我需要搜索包含csv文件的文件夹。我感兴趣的记录有3个字段:Rec、Country和Year。我的工作是搜索这些文件,看看其中是否有超过一年的记录。以下是我目前掌握的代码: //从文件夹中获取每个单独的文件 string startFolder = @"C:\MyFileFolder\"; System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder); IEnumerable<System.I
string startFolder = @"C:\MyFileFolder\";
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);
IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*",
System.IO.SearchOption.AllDirectories);
var queryMatchingFiles =
from file in fileList
where (file.Extension == ".dat" || file.Extension == ".csv")
select file;
下面是一个示例文件:
REC,IE,2014
REC,DE,2014
REC,FR,2015
现在我正努力将这两个想法结合起来,在一个查询中解决我的问题。查询应列出记录超过一年的文件
提前感谢以下几点:
string startFolder = @"C:\MyFileFolder\";
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);
IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*",
System.IO.SearchOption.AllDirectories);
var fileData =
from file in fileList
where (file.Extension == ".dat" || file.Extension == ".csv")
select GetFileData(file, ',')
;
public string GetFileData(string filesname, char sep)
{
using (StreamReader reader = new StreamReader(filesname))
{
var recs = (from line in reader.Lines(sep.ToString())
let parts = line.Split(sep)
select parts[2]);
var multipleyears = recs.Distinct().Count();
if(multipleyears > 1)
return filename;
}
}
string startFolder=@“C:\MyFileFolder\”;
System.IO.DirectoryInfo dir=新的System.IO.DirectoryInfo(startFolder);
IEnumerable fileList=dir.GetFiles(“*.*”,
System.IO.SearchOption.AllDirectories);
var文件数据=
从文件列表中的文件
其中(file.Extension==“.dat”| | file.Extension==“.csv”)
选择GetFileData(文件“,”)
;
公共字符串GetFileData(字符串filename,char sep)
{
使用(StreamReader=newstreamreader(filename))
{
var recs=(从reader.Lines(sep.ToString()中的行)
让零件=直线分割(sep)
选择零件[2]);
var multipleyears=recs.Distinct().Count();
如果(多目镜>1)
返回文件名;
}
}
不在我的开发机器上,所以这可能不会“按原样”编译,但这里有一个方向
var lines = // file.readalllines();
var years = from line in lines
let parts = line.Split(new [] {','})
select parts[2]);
var distinct_years = years.Distinct();
if (distinct_years >1 )
// this file has several years
“我的工作是搜索这些文件,看看是否有任何文件有记录
一年多了。”
这指定您想要一个布尔结果,该结果表示是否有任何文件具有这些记录
为了好玩,我将进一步扩展它:
我的工作是收集任何记录超过一年的文件
你就快到了。让我们首先声明一个类,其中包含文件中的记录:
public class MyRecord
{
public string Rec { get; set; }
public string CountryCode { get; set; }
public int Year { get; set; }
}
我将为FileInfo类创建一个扩展方法,该方法将读取文件并返回其中的MyRecords序列
有关扩展方法,请参见
现在每个文件中都有一系列MyRecords。要知道哪些文件的使用期限超过一年,让我们向FileInfoExtension类添加另一个扩展方法:
public static bool IsMultiYear(this FileInfo file, char separator)
{
// read the file, only return true if there are any records,
// and if any record has a different year than the first record
var myRecords = file.ReadMyRecords(separator);
if (myRecords.Any())
{
int firstYear = myRecords.First().Year;
return myRecords.Any(record => record.Year != firstYear);
}
else
{
return false;
}
}
超过一年的文件顺序为:
allFiles.Where(file => file.IsMultiYear(',');
将所有内容放在一行:
var allFilesWithMultiYear = new DirectoryInfo(@"C:\MyFileFolder\")
.EnumerateFiles("*.*", SearchOption.AllDirectories)
.Where(file => file.IsMultiYear(',');
通过创建两个相当简单的扩展方法,您的问题变成了一个可读性很强的语句。这并不是说文件中的时间超过一年。我的查询需要返回一个文件列表,其中我的时间超过一年。大多数文件应该只包含一年。感谢您的额外努力。这是解决我问题的办法,不用担心。一旦我可以访问linqpad:,我就会清理它。)
public static bool IsMultiYear(this FileInfo file, char separator)
{
// read the file, only return true if there are any records,
// and if any record has a different year than the first record
var myRecords = file.ReadMyRecords(separator);
if (myRecords.Any())
{
int firstYear = myRecords.First().Year;
return myRecords.Any(record => record.Year != firstYear);
}
else
{
return false;
}
}
allFiles.Where(file => file.IsMultiYear(',');
var allFilesWithMultiYear = new DirectoryInfo(@"C:\MyFileFolder\")
.EnumerateFiles("*.*", SearchOption.AllDirectories)
.Where(file => file.IsMultiYear(',');