.NET CsvWriter
来源:互联网 发布:搜狗五笔打字练习软件 编辑:程序博客网 时间:2024/06/12 23:59
Imports System.TextImports System.IO''' <summary>''' 快速写入数据到CSV文件''' </summary>Public Class CsvWriter#Region "Constants" ''' <summary> ''' Defines the default delimiter character separating each field. ''' </summary> Public Const DefaultDelimiter As Char = ","c ''' <summary> ''' Defines the default quote character wrapping every field. ''' </summary> Public Const DefaultQuote As Char = """"c ''' <summary> ''' Defines the default escape character letting insert quotation characters inside a quoted field. ''' </summary> Public Const DefaultEscape As Char = """"c ''' <summary> ''' Defines the default comment character indicating that a line is commented out. ''' </summary> Public Const DefaultComment As Char = "#"c#End Region#Region "Constructors" Sub New() Me.New(DefaultDelimiter, DefaultQuote, DefaultEscape, DefaultComment) End Sub Sub New(ByVal delimiter As Char) Me.New(delimiter, DefaultQuote, DefaultEscape, DefaultComment) End Sub ''' <summary> ''' Initializes a new instance of the CsvWriter class. ''' </summary> ''' <param name="delimiter">The delimiter character separating each field (default is ',').(分隔符号默认",")</param> ''' <param name="quote">The quotation character wrapping every field (default is ''').(需要转义的字符串 重复出现2次)</param> ''' <param name="escape"> ''' The escape character letting insert quotation characters inside a quoted field (default is '\'). ''' If no escape character, set to '\0' to gain some performance.(包装用) ''' </param> ''' <param name="comment">The comment character indicating that a line is commented out (default is '#').</param> ''' <exception cref="T:ArgumentNullException"> '''<paramref name="reader"/> is a <see langword="null"/>. ''' </exception> ''' <exception cref="ArgumentOutOfRangeException"> '''<paramref name="bufferSize"/> must be 1 or more. ''' </exception> Sub New(ByVal delimiter As Char, ByVal quote As Char, ByVal escape As Char, ByVal comment As Char) _delimiter = delimiter _quote = quote _escape = escape _comment = comment End Sub#End Region#Region "Write" Public Sub Write(ByVal writer As TextWriter, ByVal table As DataTable) Dim cols = From c As DataColumn In table.Columns Select ObjToString(c.ColumnName) writer.WriteLine(String.Join(_delimiter, cols)) Write(writer, table.Rows) End Sub Public Sub Write(ByVal writer As TextWriter, ByVal rows As IList(Of String())) For Each row In rows Dim items() As String = (From r In row Select ObjToString(r)).ToArray Dim str As String = String.Join(_delimiter, items) writer.WriteLine(str) Next End Sub Public Sub Write(ByVal writer As TextWriter, ByVal rows() As DataRow) For Each row As DataRow In rows Dim items() As String = (From o As Object In row.ItemArray Select ObjToString(o)).ToArray Dim str As String = String.Join(_delimiter, items) writer.WriteLine(str) Next End Sub Public Sub Write(ByVal writer As TextWriter, ByVal rows As DataRowCollection) For Each row As DataRow In rows Dim items() As String = (From o As Object In row.ItemArray Select ObjToString(o)).ToArray Dim str As String = String.Join(_delimiter, items) writer.WriteLine(str) Next End Sub Public Function ObjToString(ByVal obj As Object) As String If obj Is Nothing Then Return String.Empty Dim str As String = obj.ToString 'If str.Length > 30000 Then MsgBox(str) If str.Contains(_delimiter) OrElse str.Contains(_quote) OrElse str.Contains(vbCr) OrElse str.Contains(vbLf) Then Dim strb As New StringBuilder(_escape) For Each c In str If c = _quote Then strb.Append(_quote) strb.Append(c) Next strb.Append(_escape) Return strb.ToString End If Return str End Function#End Region#Region "Fields" ''' <summary> ''' Contains the <see cref="T:TextReader"/> export to the CSV file. ''' </summary> Private _writer As TextWriter ''' <summary> ''' Contains the comment character indicating that a line is commented out. ''' </summary> Private _comment As Char ''' <summary> ''' Contains the escape character letting insert quotation characters inside a quoted field. ''' </summary> Private _escape As Char ''' <summary> ''' Contains the delimiter character separating each field. ''' </summary> Private _delimiter As Char ''' <summary> ''' Contains the quotation character wrapping every field. ''' </summary> Private _quote As Char ''' <summary> ''' Indicates if the reader supports multiline. ''' </summary> Private _supportsMultiline As Boolean ''' <summary> ''' Indicates if the reader will skip empty lines. ''' </summary> Private _skipEmptyLines As Boolean#End Region#Region "Properties" ''' <summary> ''' Gets the comment character indicating that a line is commented out. ''' </summary> ''' <value>The comment character indicating that a line is commented out.</value> Public ReadOnly Property Comment As Char Get Return _comment End Get End Property ''' <summary> ''' Gets the escape character letting insert quotation characters inside a quoted field. ''' </summary> ''' <value>The escape character letting insert quotation characters inside a quoted field.</value> Public ReadOnly Property Escape As Char Get Return _escape End Get End Property ''' <summary> ''' Gets the delimiter character separating each field. ''' </summary> ''' <value>The delimiter character separating each field.</value> Public ReadOnly Property Delimiter As Char Get Return _delimiter End Get End Property ''' <summary> ''' Gets the quotation character wrapping every field. ''' </summary> ''' <value>The quotation character wrapping every field.</value> Public ReadOnly Property Quote As Char Get Return _quote End Get End Property#End RegionEnd Class
using System;using System.Collections.Generic;using System.Text;using System.IO;namespace CsvIO.Csv{ /// <summary> /// 快速写入数据到CSV文件 /// </summary> public static class CsvWriter { #region Constants /// <summary> /// Defines the default delimiter character separating each field. /// </summary> public const char DefaultDelimiter = ','; /// <summary> /// Defines the default quote character wrapping every field. /// </summary> public const char DefaultQuote = '"'; /// <summary> /// Defines the default escape character letting insert quotation characters inside a quoted field. /// </summary> public const char DefaultEscape = '"'; /// <summary> /// The space character. /// </summary> private const char SPACE = ' '; /// <summary> /// The carriage return character. Escape code is <c>\r</c>. /// </summary> private const char CR = (char)0x0d; /// <summary> /// The line-feed character. Escape code is <c>\n</c>. /// </summary> private const char LF = (char)0x0a; #endregion #region Write public static void Write(TextWriter writer, IEnumerable<string> row) { Write(writer, row, DefaultDelimiter); } public static void Write(TextWriter writer, IEnumerable<string> row, char delimiter) { bool start = false; foreach (string str in row) { if (start == true) writer.Write(delimiter); else start = true; writer.Write(CsvString(str, delimiter)); } writer.WriteLine(); } private static string CsvString(string str, char delimiter) { if (string.IsNullOrEmpty(str)) return string.Empty; bool delimit = false; StringBuilder sb = new StringBuilder(); foreach (char c in str) { if (c == delimiter || c == CR || c == LF) { delimit = true; } else if (c == DefaultQuote) { sb.Append(DefaultQuote); delimit = true; } sb.Append(c); } if (delimit) { sb.Insert(0, DefaultEscape); sb.Append(DefaultEscape); } return sb.ToString(); } #endregion }}