Объединение 2 .csv файлов, а также сортировка контента по дате с разным форматом времени - PullRequest
0 голосов
/ 25 июня 2018

В настоящее время я работаю над задачей, в которой я хочу взять содержимое 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,
30.05.2008 14:48:57 (ММ / дд / гггг ЧЧ: мм: сс) 06.01.2018 06:12:19 (ММдд.гггг ЧЧ: мм: сс) 20180601 16:21:50 (ггггМмдд ЧЧ: мм: сс)

1 Ответ

0 голосов
/ 26 июня 2018

Первые два формата должны быть достаточно стандартными, чтобы их можно было проанализировать с помощью 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)

Отсюда вы можете записать обратно в ваш выходной файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...