C#写入csv文件

时间:2017-05-19 09:09:53

标签: c# arrays csv datatable

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

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();                 
}

3 个答案:

答案 0 :(得分:1)

您应该使用已经可用的功能,而不是制作自己的日期时间格式解析器。当您知道确切的格式时,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);
    }
}

答案 1 :(得分: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文件,正如您在Write语句中指定的那样for循环。

答案 2 :(得分:0)

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

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