Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试使用linq查询同一文件夹中的多个文本文件_C#_Linq_Csv - Fatal编程技术网

C# 尝试使用linq查询同一文件夹中的多个文本文件

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

我需要搜索包含csv文件的文件夹。我感兴趣的记录有3个字段:Rec、Country和Year。我的工作是搜索这些文件,看看其中是否有超过一年的记录。以下是我目前掌握的代码:

//从文件夹中获取每个单独的文件

 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(',');