在CSV文件中编写C#对象列表

25
我有一个C#对象,其中包含8个大小为200的数组元素。我需要将这些数组打印到相应标签的CSV文件中。数据可能包含字符串、整数和浮点数。
例如:
时间 时间1 时间2 天 时间4 时间5 时间6 时间7
1      5       9   Mon    7.0   8     9     5     NA
2
3
3
.
.
200   200    200  Sun   200  200  200   200   200
哎呀,时间1等是标签(标题),数据(8个包含200个元素的列表)应写在这些标签下面。 感谢您的回复!

1
你想让别人为你编写程序吗? - CharithJ
请展示一些代码...有什么不起作用的?有任何错误信息/异常吗? - Yahia
2
在您等待的时候,我们可以给您拿些咖啡吗?顺便说一下,您要求的不是一个csv文件。您的输出缺少逗号。 - Eddy
1
只需要一点提示来提取数据并将其打印到 CSV 中。我需要提取每个列表并针对每个列表使用 FOR 循环来打印每列(标签)中的数据吗? - Venu
2
@CharithJ,实际上已经有两个人写了这个程序。声誉,它是如此令人向往。 :) - bzlm
2个回答

60
您可以编写一个通用函数来写入对象:
public void WriteCSV<T>(IEnumerable<T> items, string path)
{
  Type itemType = typeof(T);
  var props = itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                      .OrderBy(p => p.Name);

  using (var writer = new StreamWriter(path))
  {
    writer.WriteLine(string.Join(", ", props.Select(p => p.Name)));

    foreach (var item in items)
    {
      writer.WriteLine(string.Join(", ", props.Select(p => p.GetValue(item, null))));
    }
  }
}

用途:

var people = new List<Person> { new Person("Matt", "Abbott"), new Person("John Smith") };
WriteCSV(people, @"C:\people.csv");

可能会输出以下内容:
Forename, Surname
Matt", Abbott"
John", Smith"

嗨,马特,谢谢你的回复。我在使用这种方法修改我的函数时遇到了一些问题。我会尝试更多的选项并让你知道。 - Venu
将“function”更改为“void”。谢谢。这节省了我一些时间。 - Jess
你的方法无法处理大数字,例如 111254006420170506 会变成 111270196720170000 - Tom Stickel
我在各处搜索如何在MVC 5 C#项目中完成此操作。做得好,先生! - snapper
有什么方法可以将文件保留在内存中而不是写入磁盘? - cyclical

4
假设你的数据不需要逗号转义,这将为你提供一个大致的思路:
string[][] myArray = // your data
string[] myHeaders = // your headers
File.WriteAllText("somefile.csv", 
        string.Join(Environment.NewLine, 
            new[]{myHeaders}.Concat(myArray)
            .Select(line => string.Join(",", line))));

感谢您的回复。我能否使用此方法来代替文本编写器方法?使用文件会出现一些错误。 - Venu
@user:为什么不试一下然后告诉我呢? - StriplingWarrior
我对string.join不是很熟悉,使用你提供的文件和文本写入方法时出现了重载错误。请问你能帮我解决如何连接字符串并将其打印到CSV中吗?谢谢。 - Venu
@user: string.Join 返回一个字符串。上面的代码将生成您需要输出到文件的整个字符串,这就是为什么我使用了 File.WriteAllText。如果您有一个准备好写入的 TextWriter,只需调用 Write 方法并传递从上面的 string.Join 调用返回的字符串即可。我相信如果您努力解决问题,您一定能够想出来的。 - StriplingWarrior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接