【问题标题】:C# write to csv fileC# 写入 csv 文件
【发布时间】:2017-05-19 09:09:52
【问题描述】:

我想将任何列的日期动态格式化为yyyy-MM-dd。我知道我可以有条件地将特定列设置为此日期格式,但是有没有办法为所有具有日期的列动态地执行此操作。目前我在这里使用try catch,它适用于所有日期,但问题是任何不是日期的列,即 3.8707 的值将在 csv 输出上变为 01/03/8707 p>

foreach (var array in from DataRow myrow in dt.Rows select row.ItemArray)
{
    for (i = 0; i < array.Length; i++)
    {
        try
        {
             DateTime date = DateTime.Parse(array[i].ToString());
             swOut.Write(date.Year + '-' + date.Month + '-' + date.Day + ",");
        }
        catch (Exception)
        {
             swOut.Write(array[i] + ",");
        }
     }
     swOut.WriteLine();                 
}

【问题讨论】:

  • 日期格式是否始终相同 dd/mm/yyy ?还是在数组中的条目之间有所不同?

标签: c# arrays csv datatable


【解决方案1】:

Click here 并复制静态类Extensions扩展方法toDate(...)我写过(别忘了添加using System.Globalization;)。 如果您正在使用它,您可以像这样简单地进行操作,而无需捕获异常:

var arrayItems = from DataRow myrow in dt.Rows select row.ItemArray;
foreach (var array in arrayItems)
{
    for (var i = 0; i < array.Length; i++)
    {           
        var strItem = (array[i] ?? "").ToString();
        var date=strItem.toDate("yyyy-MM-dd");
        if (!date.HasValue) {
            swOut.Write(strItem + ",");
        }
        else
        {
            swOut.Write(date.Value.Year + '-' + 
                            date.Value.Month + '-' + date.Value.Day + ",");
        }
    }
    swOut.WriteLine();
}

注意如果你必须匹配不同的数据格式,只需更改函数.toDate("yyyy-MM-dd")中的参数即可。您甚至可以指定多种可接受的数据格式,如下所示:

string[] dateFmt = {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                 "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                 "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                 "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                 "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};

然后你可以在循环中使用它:

var date=strItem.toDate(dateFmt);

这样,它们将被解释和解析,然后它们将被转换为YYYY-MM-dd 并写入.csv 文件,正如您在for 循环的Write 语句中指定的那样。

【讨论】:

  • 感谢马特。但 toDate 无法解决。你使用的静态类
  • @A.Dal:请阅读我答案的开头 - click here,然后复制。这个静态类是我写的。
  • @A.Dal - 根据我给出的提示,你能解决它吗?
  • @A.Dal - 不客气,很高兴听到它正在工作! :-)
【解决方案2】:

与其制作自己的日期时间格式解析器,不如使用已有的解析器。 DateTime.TryParseExact 是您在知道确切格式时将字符串转换为日期的工具。如果您知道日期在 CSV 中以哪种格式显示,那么以您喜欢的字符串格式转换回日期是另一项任务,可以通过覆盖特定于日期时间的 ToString() 轻松解决。

在您的代码中,您使用了会降低性能的 try catch。

string[] values = lines1[i].Split(',');
if (values.Length >= 3)
{
    DateTime dt;
    if (DateTime.TryParseExact(values[0], "d-MMM-yyyy", 
        System.Globalization.CultureInfo.CurrentCulture, 
        System.Globalization.DateTimeStyles.None, out dt))
    {
        values[0] = dt.ToString("yyyy-MM-dd");
        lines1[i] = String.Join(",", values);
    }
}

【讨论】:

    【解决方案3】:

    您可以检查列的类型。像这样:

    if(array[i] is DateTime)
    {
        var date=(DateTime)array[i];
        swOut.Write(date.Year + '-' + date.Month + '-' + date.Day + ",");
    }
    else
        swOut.Write(array[i] + ",");
    

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多