合并2个.csv文件,并按日期将内容排序为不同的时间格式

时间:2018-06-25 19:29:13

标签: c# csv sorting date datetime

我目前正在执行一项任务,我要获取2个.csv文件的内容并将它们放入一个新的.csv文件中,并按日期对内容进行排序。

到目前为止很好...问题在于内容使用了几种日期时间格式

你们中的一个可以帮助我吗?

这里是我到目前为止的代码

    //reading the raw files
    string[] rawdata = File.ReadAllLines(PathInRaw);
    string[] rawdataTick = File.ReadAllLines(PathInRawTick);


    //clearing existing file and writing in the new content
    File.WriteAllText(PathOut, " ");
    File.AppendAllLines(PathOut, rawdata);
    File.AppendAllLines(PathOut, rawdataTick);


    //changing date format??? which i dont get to work
    string[] list = { };
    int counter = 0;
    foreach (string line in File.ReadAllLines(PathOut))
    {
        column = line.Split(';');
        column[0] = DateTime.Now.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
        list[counter] = Convert.ToString(column);
        counter++;
    }
    File.WriteAllText(PathOut, " ");
    File.WriteAllLines(PathOut, list);


    //sorting it
    DateTime d = DateTime.MinValue;
    var query = from line in File.ReadLines(PathOut)
                let fields = line.Split(';')
                let dateParsed = DateTime.TryParse(fields[0], out d)
                let dateObject = dateParsed ? d : DateTime.MinValue
                orderby dateParsed, dateObject
                select line;

    List<string> sortedLines = query.ToList();
    File.WriteAllText(PathOut, " ");
    File.WriteAllLines(PathOut, sortedLines);

.csv中的日期格式是
2018/5/30下午2:48:57(MM / dd / yyyy HH:mm:ss a) 06.01.2018 06:12:19(MM.dd.yyyy HH:mm:ss) 20180601 16:21:50(yyyyMMdd HH:mm:ss)

1 个答案:

答案 0 :(得分:0)

前两种格式应该足够标准,才能使用DateTime.Parse(...)进行解析。最后一个有点太习惯了,以至于无法抓住,因此实现解析方法将是您最好的选择。

private static DateTime ParseDateTime(string dateTime) {
    DateTime? d1 = null;
    try {
        d1 = DateTime.Parse(dateTime);
    }
    catch { }

    if (d1 == null) {
        try {
            d1 = DateTime.ParseExact(dateTime, "yyyyMMdd HH:mm:ss", CultureInfo.InvariantCulture);
        }
        catch { }
    }

    return (DateTime)d1;
}

在这里,第一个try catch块将捕获所有标准格式,如果不捕获,则d1对象仍为null,因此我们将尝试您的自定义格式。最后,我们将其投射回一个不可为空的DateTime对象,以使其更易于使用。

下面是一种使用此方法的方法,您可以通过读取文件来替换两个DateTime字符串的硬编码列表。

List<string> rawLines1 = new List<string>() { "5/30/2018 2:48:57 PM", "06.01.2018 06:12:19" };
List<string> rawLines2 = new List<string>() { "20180601 16:21:50" };

List<string> rawLines = new List<string>();
rawLines.AddRange(rawLines1);
rawLines.AddRange(rawLines2);

List<DateTime> parsedDateTimes = new List<DateTime>();
foreach (string rawLine in rawLines) {
    parsedDateTimes.Add(ParseDateTime(rawLine));
}

parsedDateTimes = parsedDateTimes.OrderBy(x => x).ToList();

最后一行负责按最旧的顺序排回到顶部。如果您希望将其撤消,请将.OrderBy(x => x)替换为.OrderByDescending(x => x)

您可以从这里写回输出文件。