Как читать из файла .csv с TextFieldParser, используя указанный формат даты? - PullRequest
0 голосов
/ 03 октября 2019

РЕДАКТИРОВАТЬ: Этот вопрос был основан на моем неправильном понимании поведения Excel. Я продолжал думать, что формат M / DD / YYYY был во входном файле, но это было только переформатированием Excel, TextFieldParser действительно сохранил исходный формат YYYY-MM-DD. Спасибо всем за то, что привели меня к такому выводу.

Я читаю из CSV-файла для консольного приложения, использующего класс TextFieldParser в C #, следующим образом:

using (TextFieldParser parser = new TextFieldParser(@"C:\myfilepath"))
{
    parser.TextFieldType = FieldType.Delimited; //set up parser
    parser.SetDelimiters(",", "|");

    string[] header = parser.ReadFields(); //process header
}

Форматдат во входном файле M/DD/YYYY. Однако мне нужно, чтобы формат был чем-то другим, скажем MM/DD/YYYY.

Когда TextFieldParser читает поля даты, он меняет их на формат YYYY-MM-DD, который я вижу в своих выходных данных, поэтому я знаю, что он каким-то образом распознает поля, похожие на даты, и преобразует их в определенный формат,Моя проблема сводится к простому изменению этого формата. Надеюсь, есть какой-то способ сделать это ...

Я знаю, что мог бы просто отредактировать строки дат после того, как парсер прочитал их, но мне это кажется небрежным.

Спасибо.

1 Ответ

0 голосов
/ 04 октября 2019

За MSDN TextFieldParser.ReadFields , TextFieldParser.ReadFields () - Читает все поля в текущей строке, возвращает их как массив строк

Пробовал сСледующая строка в CSV-файле:

     1,2019-10-04,04/10/2019,test

Это работает:

    using (TextFieldParser parser = new TextFieldParser(@"<path to testcsv.csv>"))
                {
                    parser.TextFieldType = FieldType.Delimited; 
                    parser.SetDelimiters(",", "|");

                    string[] current = parser.ReadFields();
                    string[] formats = new string[] { "yyyy-MM-dd", "dd/MM/yyyy", "MM/dd/yyyy" };
                    foreach (string f in current)
                    {
                        DateTime dv ;
                        if (DateTime.TryParseExact(f, formats, System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out dv))
                        {
                            Console.WriteLine($"found date - { dv.ToLongDateString()}");
                        }
                        else 
                        {
                            Console.WriteLine($"found something  - {f}");
                        }
                    }
                }
...