【问题标题】:How can I write a general Array to CSV file?如何将一般数组写入 CSV 文件?
【发布时间】:2012-01-29 19:00:50
【问题描述】:

假设我有一个 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 文件。

标签: c# arrays csv


【解决方案1】:

使用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。

【讨论】:

  • 这不能用他的Array arr参数编译,只能用string[] arr
  • 我对其进行了测试,它使用 ToString() 方法强制转换 arr。不完全是我想要的
  • @Andrey - 你为什么使用Array 类而不是string[]
【解决方案2】:

您可以更改方法以使用 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);
        }
    }
}

编辑 - 关于重复:

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

【讨论】:

  • 我可以改进它以支持锯齿状数组吗?
  • 按行排列,例如全部左对齐。
  • 此解决方案不考虑要写入的字段之一中存在的逗号,或者如果封装在引号中,则考虑到字段中的其他引号。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      FileHelper

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

      【讨论】:

        【解决方案6】:

        你也可以使用扩展方法:

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

        然后简单地调用:

        arr.ToCsv();
        

        IEnumerable 定义,您也可以将其用于List&lt;&gt;

        【讨论】:

        • 要是 csv 这么简单就好了。由于 csv 中的换行符和逗号,这将不起作用。
        • 感谢@gburton 指出这一点,我已经更新了答案。
        猜你喜欢
        • 1970-01-01
        • 2020-05-10
        • 2014-08-30
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多