在.net中写入CSV文件

时间:2009-11-06 00:42:54

标签: c# .net csv

我需要将数据集导出为CSV文件。

我花了一段时间搜索一组规则,并意识到编写CSV文件时有很多规则和例外。

http://knab.ws/blog/index.php?/archives/3-CSV-file-parser-and-writer-in-C-Part-1.html http://bytes.com/topic/c-sharp/answers/236875-problems-streamwriter-output-csv http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/0073fcbb-adab-40f0-b768-4bba803d3ccd

所以现在不是用逗号分隔字符串的简单过程,我已经搜索了现有的CSV编写器,无论是第三方还是(希望!)都包含在.net框架中。

编辑:新链接: http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-CSV-using-DynamicObject-and-TextFieldParser

TextFieldParser是一个VB对象(可以从C#引用),它将自动解析CSV文件。 :)

我想知道是否有人知道任何方便的.Net(2.0 - > 3.5和4.0)库,可用于生成格式正确的CSV文件。

此外,如果有任何规则集用于生成CSV文件。

有很多关于CSV阅读器和解析CSV文件的细节,但是没有多少关于写作(好吧,我知道它正好相反:P)。

http://www.codeproject.com/KB/database/CsvReader.aspx

非常感谢任何帮助:)

我发现另一篇文章包含更详细的CSV规则: http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm

一个整洁的第三方库是Linq-to-CSV(不是框架库): http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

感谢大家的帮助。 我已经决定最好的解决方案是创建一个简单的静态类,它将进行特殊的字符替换(Chris提到)。

如果我需要Linq查询我的CSV文件,我会查看Linq-to-CSV的CodeProjects实现。

再次感谢:)

11 个答案:

答案 0 :(得分:48)

CsvHelper(我维护的图书馆)也可以通过NuGet获得。

CsvHelper可以自动将您的类对象写入文件。

var myObj = new MyCustomClass
{
    Prop1 = "one",
    Prop2 = 2
};
var streamWriter = // Create a writer to somewhere...
var csvWriter = new CsvWriter( streamWriter );

// You can write a single record.
csvWriter.WriteRecord( myObj );

// You can also write a collection of records.
var myRecords = new List<MyCustomClass>{ myObj };
csvWriter.WriteRecords( myRecords );

答案 1 :(得分:22)

如果您的单元格中有逗号,请用双引号括起整个单元格,例如:

cell 1,cell 2,"This is one cell, even with a comma",cell4,etc

如果你想要一个双字引号,可以做两个,例如:

cell 1,cell 2,"This is my cell and it has ""quotes"" in it",cell 4,etc

至于日期,坚持ISO格式,你应该没事(例如yyyy-mm-dd hh:mm:ss)

答案 2 :(得分:18)

我只想添加一个RFC来指定CSV格式,这是我认为的规范来源。

答案 3 :(得分:6)

我广泛使用了filehelpers,这对于生成CSV非常棒。

答案 4 :(得分:4)

以下是可用于从字符串列表生成一行CSV文件的函数(IEnumerable(Of String)或字符串数​​组也可以使用):

Function CreateCSVRow(strArray As List(Of String)) As String
    Dim csvCols As New List(Of String)
    Dim csvValue As String
    Dim needQuotes As Boolean
    For i As Integer = 0 To strArray.Count() - 1
        csvValue = strArray(i)
        needQuotes = (csvValue.IndexOf(",", StringComparison.InvariantCulture) >= 0 _
                      OrElse csvValue.IndexOf("""", StringComparison.InvariantCulture) >= 0 _
                      OrElse csvValue.IndexOf(vbCrLf, StringComparison.InvariantCulture) >= 0)
        csvValue = csvValue.Replace("""", """""")
        csvCols.Add(If(needQuotes, """" & csvValue & """", csvValue))
    Next
    Return String.Join(",", csvCols.ToArray())
End Function

我认为,将VB.NET转换为C#并不困难

答案 5 :(得分:3)

答案 6 :(得分:3)

我知道你说你找到了答案,但我只想对你提到的LINQtoCSV库投票。我已经在几个项目中使用它,它非常适合保持业务代码的清洁,而不关心文件格式的细节/特性。

也许在你的特定情况下编写导出器并不困难,但这个库的好处是它是双向的。如果您发现自己不得不在路上使用CSV,那么它不需要额外的代码,并且/或者它为您提供了一个可用于未来项目的一致库。

答案 7 :(得分:2)

您可以使用ODBC来读取和写入CSV文件(通过OdbcConnection和合适的连接字符串)。这对于生成CSV文件应该相当不错,并且会处理诸如引用之类的内容;但是当我用它来读取其他程序生成的CSV文件时,我遇到了一些问题。

答案 8 :(得分:2)

要添加到其他规则的另一个规则:使用逗号作为字段分隔符而不是字段终止符。这样做的原因是一行末尾的尾随逗号可能不明确:它没有意义,或者它是否表示跟随它的NULL值?

答案 9 :(得分:0)

我发现这个重要的链接非常整洁。还没有尝试过,会让你知道它是怎么回事!

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

仔细观察,这个实现基本上也只使用基本规则:

special chars = \ n \“和分隔符char。

如果找到特殊字符,则用引号括起来。 用双引号替换引号。

基本上是克里斯提到的规则。 我认为最简单的方法是根据简单的规则创建我的帮助方法,并根据用户需求进行修改。

答案 10 :(得分:0)

您可以使用字符串数组,然后使用以下连接:

string out = "";
string[] elements = { "1", "2" };
foreach(string s in elements) { out += s + "," };
out = out.substring(0, out.Length-1);