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

And*_*ein 2 c# csv arrays

假设我在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()+",");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ode*_*ded 12

使用String.Join:

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

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


请注意,假设你有一个string[]作为第二个参数-你似乎在传递的一个实例Array类(这是不是一个string[]为你写你的问题).


更新:

由于您没有传入a string[],因此您应该使用文件助手来确保将对象正确写入CSV.


Ada*_*dam 5

您可以更改方法以使用C#Generics并使用描述性函数和变量名称.这实际上导致相同的行为,除了对值类型避免装箱.

public static void SaveArrayAsCSV<T>(T[] arrayToSave, string fileName)
{
    using (StreamWriter file = new StreamWriter(fileName))
    {
        foreach (T item in arrayToSave)
        {
            file.Write(item + ",");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:对锯齿状数组做同样的事情(假设它们只包含一个嵌套级别)你可以使用这个重载(不推荐,见下文!):

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑 - 关于重复:

当然,上述解决方案是次优的,因为它仅适用于某些特定场景(我们只有一个嵌套级别).不幸的是,如果重构我们的代码,我们必须停止使用泛型,因为我们的输入数组现在可能包含Type T或Type的元素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 + ",");   
    }
}
Run Code Online (Sandbox Code Playgroud)