在.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
所以现在它不是一个用逗号分隔string的简单过程,我已经在.net框架中search了一个现有的CSV编写器,无论是第三方还是(希望!)。
编辑:新链接: http : //www.thinqlinq.com/Post.aspx/Title/LINQ-to-CSV-using-DynamicObject-and-TextFieldParser
TextFieldParser是一个VB对象(可以从C#中引用)自动parsingCSV文件。 🙂
我想知道是否有人知道任何方便的.net(2.0 – > 3.5和4.0)库可用于生成一个正确格式的CSV文件。
另外,如果有任何生成CSV文件的规则集。
有很多的CSV阅读器和parsingCSV文件的细节,但不是很多关于写作(好吧,我知道它恰恰相反: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
谢谢大家的帮助。 我已经决定,最好的解决scheme将是创build一个简单的静态类,将做特殊字符replace(克里斯提到)。
如果我需要Linq查询我的CSV文件,我会查看Linq-to-CSV的CodeProjects实现。
再次感谢 :)
如果你的单元格中有逗号,用双引号括住整个单元格,例如:
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
至于date,坚持ISO格式,你应该罚款(例如,yyyy-mm-dd hh:mm:ss)
http://csvhelper.com也可以通过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 );
我只想添加一个RFC ,它指定了我认为是规范来源的CSV格式。
我已经广泛使用了文件帮助程序 ,生成CSV文件非常棒。
以下是可用于从string列表中生成一行CSV文件的函数(IEnumerable(Of String)或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#并不困难)
我知道你说你find了你的答案,但我只是想给你提到的LINQtoCSV库进行投票。 我已经在几个项目中使用它,它非常适合保持业务代码清洁,而不关心文件格式的细节/特性。
也许在你的具体情况下写出口商并不难,但是这个库的好处在于它是双向的。 如果你发现自己不得不在使用CSV的时候没有太多额外的代码,并且/或者它给你一个一致的库,以便在未来的项目中使用。
您可以使用ODBC读取和写入CSV文件(通过OdbcConnection和一个合适的连接string)。 这对于生成CSV文件应该是相当不错的,并且会处理像引用你的东西; 但是我用它来读取其他程序生成的CSV文件时遇到了一些问题。
另一个要添加到其他规则:使用逗号作为字段分隔符而不是字段终结符。 原因是行末尾的逗号可能是模棱两可的:它没有意义,或者它表示后面的NULL值?
我发现这个非常整洁的重要环节。 还没有尝试过,会让你知道它是怎么回事!
http://www.codeproject.com/KB/linq/LINQtoCSV.aspx
仔细一看,这个实现本质上也只是使用基本规则:
特殊字符= \ n \“和分隔符char。
如果find特殊字符,则用引号括起来。 用双引号replace引号。
基本上克里斯提到的规则。 我认为最简单的方法就是根据简单的规则创build我的帮手方法,并根据用户需求进行修改。
你可以使用一个string数组,然后连接使用:
string out = ""; string[] elements = { "1", "2" }; foreach(string s in elements) { out += s + "," }; out = out.substring(0, out.Length-1);