VB.NET
Public Sub ConvertDataTableToCsv( _
dt As DataTable, csvPath As String, writeHeader As Boolean)
Dim enc As System.Text.Encoding = _
System.Text.Encoding.GetEncoding("Shift_JIS")
Dim sr As New System.IO.StreamWriter(csvPath, False, enc)
Dim colCount As Integer = dt.Columns.Count
Dim lastColIndex As Integer = colCount - 1
Dim i As Integer
If writeHeader Then
For i = 0 To colCount - 1
Dim field As String = dt.Columns(i).Caption
field = EncloseDoubleQuotesIfNeed(field)
sr.Write(field)
If lastColIndex > i Then
sr.Write(","c)
End If
Next
sr.Write(vbCrLf)
End If
Dim row As DataRow
For Each row In dt.Rows
For i = 0 To colCount - 1
Dim field As String = row(i).ToString()
field = EncloseDoubleQuotesIfNeed(field)
sr.Write(field)
If lastColIndex > i Then
sr.Write(","c)
End If
Next
sr.Write(vbCrLf)
Next
sr.Close()
End Sub
Private Function EncloseDoubleQuotesIfNeed(field As String) As String
If NeedEncloseDoubleQuotes(field) Then
Return EncloseDoubleQuotes(field)
End If
Return field
End Function
Private Function EncloseDoubleQuotes(field As String) As String
If field.IndexOf(""""c) > -1 Then
field = field.Replace("""", """""")
End If
Return """" & field & """"
End Function
Private Function NeedEncloseDoubleQuotes(field As String) As Boolean
Return field.IndexOf(""""c) > -1 OrElse _
field.IndexOf(","c) > -1 OrElse _
field.IndexOf(ControlChars.Cr) > -1 OrElse _
field.IndexOf(ControlChars.Lf) > -1 OrElse _
field.StartsWith(" ") OrElse _
field.StartsWith(vbTab) OrElse _
field.EndsWith(" ") OrElse _
field.EndsWith(vbTab)
End Function
C#public void ConvertDataTableToCsv(
DataTable dt, string csvPath, bool writeHeader)
{
System.Text.Encoding enc =
System.Text.Encoding.GetEncoding("Shift_JIS");
System.IO.StreamWriter sr =
new System.IO.StreamWriter(csvPath, false, enc);
int colCount = dt.Columns.Count;
int lastColIndex = colCount - 1;
if (writeHeader)
{
for (int i = 0; i < colCount; i++)
{
string field = dt.Columns[i].Caption;
field = EncloseDoubleQuotesIfNeed(field);
sr.Write(field);
if (lastColIndex > i)
{
sr.Write(',');
}
}
sr.Write("\r\n");
}
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < colCount; i++)
{
string field = row[i].ToString();
field = EncloseDoubleQuotesIfNeed(field);
sr.Write(field);
if (lastColIndex > i)
{
sr.Write(',');
}
}
sr.Write("\r\n");
}
sr.Close();
}
private string EncloseDoubleQuotesIfNeed(string field)
{
if (NeedEncloseDoubleQuotes(field))
{
return EncloseDoubleQuotes(field);
}
return field;
}
private string EncloseDoubleQuotes(string field)
{
if (field.IndexOf('"') > -1)
{
field = field.Replace("\"", "\"\"");
}
return "\"" + field + "\"";
}
private bool NeedEncloseDoubleQuotes(string field)
{
return field.IndexOf('"') > -1 ||
field.IndexOf(',') > -1 ||
field.IndexOf('\r') > -1 ||
field.IndexOf('\n') > -1 ||
field.StartsWith(" ") ||
field.StartsWith("\t") ||
field.EndsWith(" ") ||
field.EndsWith("\t");
}