我需要将数据集导出为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实现。
再次感谢:)
答案 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);