我如何写一个通用数组到CSV文件

本文关键字:数组 CSV 文件 何写一 | 更新日期: 2023-09-27 18:19:04

假设我在c#中有一个对象数组,我想把它写入CSV格式的文件。
假设每个对象都有一个ToString()方法,这就是我想要打印的内容。

目前我正在使用这个代码:

public static void dumpArray(Array arr, string fileName)
{
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileName))
    {
        foreach (Object obj in arr)
        {
             file.Write(obj.ToString()+",");
        }
    }
}

c#框架中有什么内置的东西吗,或者你认为有更好的方法吗?

我如何写一个通用数组到CSV文件

使用字符串。加入:

using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileName))
{
    file.Write(string.Join(",", arr));
}

但是,如果你确实在编写CSV文件,你应该使用CSV库,比如File Helpers,因为CSV并不像大多数人想象的那么简单——参见RFC 4180。


请注意,假设您有string[]作为第二个参数-您似乎正在传递Array类的实例(如您在问题中所写的,它是而不是 string[])。


更新:

由于您是而不是传入string[],您应该使用文件助手来确保对象被正确写入CSV。

您可以将方法更改为使用 c#泛型并使用描述性函数和变量名。这本质上导致了相同的行为,只是避免了值类型的装箱。

public static void SaveArrayAsCSV<T>(T[] arrayToSave, string fileName)
{
    using (StreamWriter file = new StreamWriter(fileName))
    {
        foreach (T item in arrayToSave)
        {
            file.Write(item + ",");
        }
    }
}
要对锯齿数组做同样的事情(假设它们只包含一个嵌套级别),您可以使用此重载(不推荐,见下文!):
public static void SaveArrayAsCSV<T>(T[][] jaggedArrayToSave, string fileName)
{
    using (StreamWriter file = new StreamWriter(fileName))
    {
        foreach (T[] array in jaggedArrayToSave)
        {
            foreach (T item in array)
            {
               file.Write(item + ",");
            }
            file.Write(Environment.NewLine);
        }
    }
}

编辑-关于复制:

当然,上面的解决方案是次优的,因为它只在一些特定的场景中起作用(我们只有一层嵌套)。不幸的是,如果重构代码,我们必须停止使用泛型,因为输入数组现在可能包含类型为TT[]的元素。因此,我们提出了以下代码,是首选的解决方案,因为尽管它重新引入了装箱,但它更具可读性,冗余性更低,并且适用于更广泛的场景:
public static void SaveArrayAsCSV(Array arrayToSave, string fileName)
{
    using (StreamWriter file = new StreamWriter(fileName))
    {
        WriteItemsToFile(arrayToSave, file);
    }
}
private static void WriteItemsToFile(Array items, TextWriter file)
{
    foreach (object item in items)
    {
        if (item is Array)
        {
            WriteItemsToFile(item as Array, file);
            file.Write(Environment.NewLine);
        }
        else file.Write(item + ",");   
    }
}

我相信.csv文件可以被视为纯文本文件.txt。您可以轻松使用:

File.WriteAllText(@"test.csv", string.Join(",", myDataArray));

你最好使用像FileHelpers这样的东西:快速且易于使用:http://www.filehelpers.com/

FileHelper

不确定Java是否支持内置CSV库

您也可以使用扩展方法:

public static string ToCsv<T>(this IEnumerable<T> ary)
{
  return string.Join(",", ary);
}

,然后调用:

arr.ToCsv();

是为IEnumerable定义的,您也可以将其用于List<>