如何将常规数组写入CSV文件?

时间:2011-12-29 10:17:44

标签: c# arrays csv

假设我在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#框架中是否有任何内置,或者您认为有更好的方法吗?

6 个答案:

答案 0 :(得分:12)

使用String.Join

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

但是,如果您确实在编写CSV文件,则应使用File Helpers等CSV库,因为CSV并不像大多数人想象的那样简单 - 请参阅RFC 4180


请注意,假设您有string[]作为第二个参数 - 您似乎正在传递Array类的实例( a { {1}}正如您在问题中写的那样)。


更新

由于您 传递string[],因此您应该使用File Helpers来确保将对象正确写入CSV。

答案 1 :(得分:5)

您可以更改方法以使用 C#Generics 并使用描述性函数和变量名称。除了对值类型避免使用boxing之外,这实际上会产生相同的行为。

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

编辑 - 关于重复:

上述解决方案当然是次优的,因为它仅适用于某些特定场景(我们只有一个嵌套级别)。不幸的是,如果重构我们的代码,我们必须停止使用泛型,因为我们的输入数组现在可能包含类型T或类型T[]的元素。因此,我们提出以下代码,这是首选解决方案,因为虽然它重新引入了装箱,但更具可读性,更少冗余,适用于更广泛的场景:

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 + ",");   
    }
}

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

使用FileHelpers更好:快速且易于使用:http://www.filehelpers.com/

答案 4 :(得分:1)

FileHelper

不确定Java支持的内置CSV库。

答案 5 :(得分:0)

您还可以使用扩展方法:

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

然后简单地调用:

arr.ToCsv();

IEnumerable定义后,您也可以将其用于List<>