使用C#写入CSV文件

3
我正在寻找一种在CSV文件的另一个单元格中编写字符串的方法。
我正在使用这个程序,
    private void button1_Click(object sender, EventArgs e)
    {
        string filePath = @"E:\test.csv";  

        string a = "a";
        string b = "c";
        string c = "d";
        string d = "d";

        File.WriteAllText(filePath, a);
        // how can add the other strings in the next cells ?
    }

这里我需要在第一个单元格中写入"a",在第二个单元格中写入"b",c...
3个回答

10

CSV 是一种相当简单的文件格式,特别是如果你不需要任何单元格包含嵌套逗号。 CSV 的意思是 逗号分隔值,所以你只需要一种方法来构建一个字符串,其中每个单元格之间有逗号。 这将起作用,尽管它仅适用于单行:

File.WriteAllText(filePath, String.Join(",", a, b, c, d));

1
对于 String.Join,任何包含换行符或保留字符的参数都会完全破坏它。 - Chris Marisic
@Chris - 是的,这并没有考虑到引用、逗号等细节。但是一个简单的解决方案可能是一个绝对初学者最容易使用的。 - Justin
@Justin,对于初学者来说,简单却是错误的做法,特别是在这种情况下。一旦遇到含有这些字符的数据,如果使用此方法作为解决方案,您将开始进行繁琐的字符串操作以尝试“修复”问题,这将变得非常脆弱,并且可能会被重复多次。正确的方法是使用一个库来处理所有这些内容,并且它是配置方面的练习而不是算法方面的。 - Chris Marisic
+1 我不同意 @Chris 的观点 - 对于手头的问题,应该使用最简单的解决方案,尽管边界条件应该是清晰的(并且提到 FileHelpers 用于更高级的场景肯定也没有坏处)。 - jeroenh
1
@jeroenh 我十分坚信KISS和YAGNI原则,但是简单与为了简单而精心设计之间有所不同,这个示例显然是后者,并不是真正的简单。 - Chris Marisic

3

CSV绝不是一种简单的文件格式,它是一种相当复杂的格式,能够涵盖几乎任何形状或大小的数据。

CSV格式能够处理可选参数和非可选参数、带有或不带有换行符的数据,并且应该能够在任何字段中使用或不使用字段转义字符而没有换行符,在具有换行符的字段中必须使用字段转义字符。

您不应该手动处理CSV文件,而应该使用FileHelpers来处理CSV文件。

目前,我不再使用FileHelpers作为我的CSV解析库,我使用Josh Close的CsvHelper


2
CSV的问题在于没有固定的格式(依赖于文化),有些应用程序使用自己的实现。然而,每个实现相对简单。请访问http://en.wikipedia.org/wiki/Comma-separated_values获取更多信息。 - C.Evenhuis
可以使用Excel文件吗? - Wassim AZIRAR
1
@dotNET 是的,当你打开CSV文件时,Excel正确地支持所有这些功能,但是Excel在创建CSV文件方面非常糟糕。如果我手工创建CSV文件,我使用Open Office Calc(它们的Excel),否则我使用FileHelpers生成它们,Excel可以轻松消费它们。 - Chris Marisic
请问您有没有解决这个问题的方案?因为我尝试了csv、xlsx、xls,但是结果都相同——所有的字符串都添加在第一个单元格中!! - Wassim AZIRAR
@dotNET 我可以非常肯定地告诉你,使用FileHelpers生成的CSV文件可以在Excel中正确打开(我在生产环境中使用FileHelpers)。如果您编辑您的问题并发布您尝试与FileHelpers交互的代码,我很乐意指出任何我看到错误的地方。 - Chris Marisic

0
如果只有4个值,并且只有一行呢?(我猜这不是情况吧?)
string csv = string.Format("{0},{1},{2},{3}\n", a,b,c,d);
File.WriteAllText(filePath, csv);

如果数据基于某种集合,请提供更多信息。

-1 这将被任何包含换行符或保留字符的参数破坏。 - Chris Marisic
是的,这不是一个通用解决方案,绝对不是编写CSV文件的全能解决方案。然而,在许多情况下,以这种(或类似)方式构建CSV(或任何分隔符)文件是完全可以接受的,因为传入数据处于预期或清理过的格式。我的解决方案(以及Justin的解决方案)将适用于问题中的示例。 - Jon

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