C#中是否有CSV读/写库?

133

有没有在C#中可以读写CSV的库?


81
我不同意。这绝对是一个有建设性的问题,并且是在谷歌上搜索.net csv library的第一个结果。虽然只是个人经验,但我的说法得到了证明,因为过去六年中,这个问题已被查看超过22000次。 - shovavnik
6
真的说 - 谷歌上的第一个搜索结果 - Robetto
这里有一个很好的速度比较:https://www.joelverhagen.com/blog/2020/12/fastest-net-csv-parsers - Neil
5个回答

120

试试CsvHelper。它使用起来与FastCsvReader一样容易,而且还可以写入。我之前一直很满意FastCsvReader,但我需要一个同时能读写的东西,而且对FileHelpers也不满意。

翻译:

尝试使用CsvHelper。它与FastCsvReader一样易于使用,同时还可进行写入操作。过去我一直很喜欢FastCsvReader,但我需要一个既能读又能写的工具,并且对FileHelpers不太满意。
var csv = new CsvReader( stream );
var myCustomTypeList = csv.GetRecords<MyCustomType>();

写作:

var csv = new CsvWriter( stream );
csv.WriteRecords( myCustomTypeList );

完全公开:我是这个库的作者。


3
谢谢,Josh。我尝试了一下,速度很快,内存使用也很高效。我认为对于第一次使用的用户来说,文档可以再改进一下,但已经足够了。 - Sam
1
有没有一种方法可以在不使用自定义类型的情况下使用这个库,以便我可以遍历我的表格网格(自定义),然后写出标题并传递每行字段?我只是想找到一种方法来防止文件中的错误(正确转义等)。 - u84six
是的,你可以使用 WriteField。在这里查看文档 https://joshclose.github.io/CsvHelper/ - Josh Close
1
@Zimano 不是真的。你可以读取单个字段,甚至只获取行的字符串数组。请查看文档。https://joshclose.github.io/CsvHelper - Josh Close
@JoshClose 哦,听到这个消息很好,谢谢!我只看了这里的入门指南:https://joshclose.github.io/CsvHelper/getting-started#reading-a-csv-file,但它并没有包括我的用例。我应该再仔细看看,抱歉。不过,在那个页面上确实说使用某种映射是使用 CsvHelper 的推荐方式。也许它可以在那个位置提供一些替代的读取策略?顺便说一下,我已经删除了我的原始评论,因为现在它已经不相关了 :-) - Zimano
当然。在GitHub上提交一个问题以将其添加到文档中,它将被添加。 - Josh Close

23

有几种选项可以在框架本身中处理。

最简单的之一是引用Microsoft.VisualBasic,然后使用TextFieldParser。 它是核心框架中完全功能的CSV阅读器。

另一个不错的选择是使用数据集来读取CSV文件


6
我一直想知道为什么它在Microsoft.VisualBasic程序集中……难道微软认为C#开发人员不使用CSV吗? - Thomas Levesque
4
@Thomas:特别是因为许多C#开发人员一想到要在他们的项目中包含VisualBasic程序集就会感到不舒服。 - user195488
2
是的 - 里面有很多不错的东西。我认为这更多是因为VB有一些语言结构最初没有被考虑在框架中,但他们永远无法让VB6用户跨越而没有实现它们。Devices和ApplicationServices名称空间具有各种有用的功能。 - Reed Copsey
21
任何在项目中引用 Microsoft.VisualBasic 而感到不舒服的 C# 开发者都是语言恶劣者。更糟糕的是,他们根本不理解 .NET。 - Ash
3
另一个VB程序集宝石是CopyDirectory:https://dev59.com/questions/kHVD5IYBdhLWcg3wL4iM - user295190
显示剩余2条评论

17

Sebastien Lorion在CodeProject上有一个很棒的CSV阅读器,名为快速CSV阅读器。对于C#来说可能是最好的之一,而且还是免费的。

至于写入,只需使用StreamWriter即可。

以下是一些用于将DataGridView写入文件的样板代码:

private void exportDGVToCSV(string filename)
{
    if (dataGridView1.Columns.Count != 0) 
    {    
        using (Stream stream = File.OpenWrite(filename))
        {
            stream.SetLength(0);
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // loop through each row of our DataGridView
                foreach (DataGridViewRow row in dataGridView1.Rows) 
                {
                    string line = string.Join(",", row.Cells.Select(x => $"{x}"));
                    writer.WriteLine(line);
                }

                writer.Flush();
            }
        };
    }
}

2
这是我的最爱。一个很棒的小库。 - Alex
2
编写CSV很容易 - 只需使用普通的文本输出方法,并用逗号分隔即可。您实际上只需要一个库/自定义处理程序来进行读取... - Reed Copsey
11
如果您想正确转义逗号和引号,那么这并不太琐碎。我甚至不确定是否有标准化的方法,但这是非常普遍的做法。 - Stefan Steinegger
28
写入CSV文件比较复杂。如果你想在CSV文件中表达含有逗号或换行符的数据,需要用引号将数据括起来。如果新加入的被引号包围的数据中又有一个引号,那么你需要用两个引号来转义。你可以自己编写代码实现这个逻辑,但最好使用一个库来帮你完成。 - Tinister
4
标准化参考文献为RFC 4180。http://tools.ietf.org/html/rfc4180 - Josh Close
显示剩余5条评论

7
是的 - 不过我猜您实际上是在询问具体细节?
可以尝试使用FileHelpers

我确实尝试过,但由于某种奇怪的原因,FileHelpers会随机崩溃。此外,FileHelpers库已经很长时间没有得到开发了。 - Erik Schierboom
1
FileHelpers现在正在积极开发中,请查看GitHub - xmedeko

4

有几十种选择。

http://www.filehelpers.net/ 是其中最常见的之一。

我必须说,我发现 Filehelpers 在某些情况下很受限制,因此我使用 The Fast CSV Reader 代替。 根据我的经验,如果您不知道 CSV 文件或导入映射的格式直到运行时 - 这是更好的库要使用。


我们也使用FileHelpers。 - Tangurena
1
我发现配置FileHelpers很麻烦。FastCsvReader使用起来要容易得多。 - Josh Close
+1 给 FastCsvReader。性能非常出色。但它主要是一个读取器/解析器,不是写入器。 - Mehdi LAMRANI

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