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

izj3ouym  于 2023-06-27  发布在  其他
关注(0)|答案(6)|浏览(92)

假设我有一个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#框架中有没有内置的东西,或者你认为有更好的方法?

iyr7buue

iyr7buue1#

使用String.Join

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[],所以你应该使用File Helpers来确保对象被正确地写入CSV。

icnyk63a

icnyk63a2#

您可以更改方法以使用C#泛型并使用描述性函数和变量名。这基本上会导致相同的行为,只是避免了值类型的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);
        }
    }
}

EDIT -关于重复:

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

ev7lccsx3#

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

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

l3zydbqr4#

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

vyswwuz2

vyswwuz25#

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

tcbh2hod

tcbh2hod6#

您也可以使用扩展方法:

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

然后简单地调用:

arr.ToCsv();

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

相关问题