如何将常规数组写入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#框架中是否有任何内置,或者您认为有更好的方法吗?

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

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

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

 public static void SaveArrayAsCSV(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); } } } 

编辑 – 关于重复:

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

使用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[] ,因此您应该使用文件助手来确保将对象正确写入CSV。

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

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

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

FileHelper

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

您还可以使用扩展方法:

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

然后简单地打电话:

 arr.ToCsv(); 

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