■■■

2016年4月2日土曜日

データテーブル(配列)からCSVファイルに保存する方法

データテーブル(配列)からCSVファイルに保存する方法
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");
}

■■■