【问题标题】:How to read from .csv file with TextFieldParser using a specified date format?如何使用指定日期格式从 TextFieldParser 读取 .csv 文件?
【发布时间】:2019-10-03 20:24:33
【问题描述】:

编辑:这个问题是基于我对 Excel 行为的误解。我一直认为 M/DD/YYYY 格式在输入文件中,但这只是 Excel 对其重新格式化,TextFieldParser 确实保留了原始格式 YYYY-MM-DD。感谢大家引导我得出这个结论。

我正在使用 C# 中的 TextFieldParser 类从控制台应用程序的 .csv 文件中读取,如下所示:

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 的格式,我在输出中看到了这种格式,所以我知道它以某种方式识别看起来像日期的字段并将它们转换为特定格式。我的问题归结为简单地改变这种格式。希望有一些方法可以做到这一点......

我知道我可以在解析器读取日期字符串后简单地编辑它们,但这对我来说似乎很草率。

谢谢。

【问题讨论】:

  • 你能展示你的示例输入数据吗?
  • 如果将它们解析为 Date 变量,则文本文件格式变得无关紧要。您应该知道 CSVHelper 等工具会为您读取、解析数据并将其键入到类和集合中
  • @Sach,不,我不能。信息很敏感。无论是在记事本、写字板、Excel 等中打开,日期格式都是 M/DD/YYYY(如果您想知道的话)。
  • 我不需要实际数据,只需要一个样本。日期格式是 M/DD/YYYY 令人怀疑,因为它不会在 9 月之后显示几个月吗?你必须坚持TextFieldParser吗? CSVHelper nuget 包更适合处理 CSV 文件。
  • 您的问题无法重现。我使用了像 5/23/2018 这样的输入文本,它使用您的代码读取。请提供完整的相关代码和示例数据。

标签: c# csv datetime-format textfieldparser


【解决方案1】:

根据 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}");
                        }
                    }
                }

【讨论】:

  • 这对我有用。谢谢,不知道为什么它没有被接受为答案
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多