聚合不同的文件CSV

时间:2014-10-14 13:23:04

标签: c# c#-3.0

我是C#的初学者,我不太详细了解API。 我想从每个文件中写一个包含单日的.csv,并包含每个文件中的数据。

2 个答案:

答案 0 :(得分:2)

这将返回按文件名的前8个字符分组的所有CSV文件名,即这些文件所属的日期。

public Dictionary<string, List<string>> GetCsvFilesGroupedByDate(string csvDirectory)
{
    var csvFiles = Directory.GetFiles(csvDirectory, "*.csv");

    var groupedByDate = csvFiles.GroupBy(s => Path.GetFileName(s).Substring(0, 8));

    return groupedByDate.ToDictionary(g => g.Key, g => g.ToList());
}

然后你可以循环结果:

var files = GetCsvFilesGroupedByDate(@"C:\CSV\");

foreach (var filesPerDate in files)
{
    // parse / concatenate CSV using filesPerDate.Key and filesPerDate.ToList()
}

答案 1 :(得分:2)

你必须在C#3.0中使用普通循环,你可以填充Dictionary例如:

string dir = @"C:\DirectoryName";
string[] files = Directory.GetFiles(dir, "*.csv", SearchOption.TopDirectoryOnly);
var dateFiles = new Dictionary<DateTime, List<string>>();

foreach (string file in files)
{
    string fn = Path.GetFileNameWithoutExtension(file);
    if (fn.Length < "yyyyMMdd_HHmmss".Length)
        continue;
    string datePart = fn.Remove("yyyyMMdd".Length); // we need only date
    DateTime date;
    if (DateTime.TryParseExact(datePart, "yyyyMMdd", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out date))
    {
        bool containsDate = dateFiles.ContainsKey(date);
        if (!containsDate) dateFiles.Add(date, new List<string>());
        dateFiles[date].Add(file);
    }
}

foreach(KeyValuePair<DateTime, List<string>> dateFile in dateFiles)
    MergeFilesForDay(dir, dateFile.Key, dateFile.Value);

这是一个创建新文件的方法:

static void MergeFilesForDay(string dir, DateTime date, List<string> files)
{ 
    string file = Path.Combine(dir, date.ToString("yyyyMMdd") + ".csv");
    using(var stream = File.CreateText(file))
    {
        foreach(string fn in files)
            foreach(string line in File.ReadAllLines(fn))
                stream.WriteLine(line);
    }
}