CSVファイル差分(C#/VB.NET)
2010年05月29日
CSVファイルを比較してセル単位の差分を表示するサンプル(ソース/コード)です。まずCSVファイルを行単位に分割し、次にセル単位に分割し比較します。そして変更があるセルの色を変更しています。画面イメージを貼って置きます。
ちなみに、テキストファイルの行単位差分のサンプルはこちらです。
テキストファイル比較(C#/VB.NET)
' --------------------------------------------------------
' CSVファイルの差分を表示するサンプル(VB.NET/VS2005)
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' CSVファイル読込
Dim sr0 As IO.StreamReader = _
New IO.StreamReader("D:\Temp\TestCsv1.txt", _
Encoding.GetEncoding("Shift-JIS"))
Dim sr1 As IO.StreamReader = _
New IO.StreamReader("D:\Temp\TestCsv2.txt", _
Encoding.GetEncoding("Shift-JIS"))
Dim dt0 As String = sr0.ReadToEnd()
Dim dt1 As String = sr1.ReadToEnd()
sr0.Close()
sr1.Close()
' 変更前のデータを行単位分割
dt0 = dt0.Replace(vbCrLf, vbLf)
Dim row0() As String = dt0.Split(vbLf)
If row0(row0.Length - 1) = "" Then
Array.Resize(Of String)(row0, row0.Length - 1)
End If
' 変更後のデータを行単位分割
dt1 = dt1.Replace(vbCrLf, vbLf)
Dim row1() As String = dt1.Split(vbLf)
If row1(row1.Length - 1) = "" Then
Array.Resize(Of String)(row1, row1.Length - 1)
End If
' 変更前後の行数を合わせる
If row0.Length > row1.Length Then
Array.Resize(Of String)(row1, row0.Length)
ElseIf row0.Length < row1.Length Then
Array.Resize(Of String)(row0, row1.Length)
End If
' CSVファイルの差分表示
DataGridView1.Rows.Clear()
For i As Integer = 0 To row0.Length - 1
DataGridView1.Rows.Add()
Dim cel0 As String()
Dim cel1 As String()
' 変更前の行データをセル単位分割
row0(i) = row0(i) & ",,,,"
cel0 = row0(i).Split(",")
Array.Resize(Of String)(cel0, 5)
' 変更後の行データをセル単位分割
row1(i) = row1(i) & ",,,,"
cel1 = row1(i).Split(",")
Array.Resize(Of String)(cel1, 5)
For j As Integer = 0 To cel1.Length - 1
' 変更後データのセルデータ表示
DataGridView1(j, i).Value = cel1(j)
' 変更前後のセルデータ比較
If cel0(j) <> cel1(j) Then
' 変更セルの色変更
DataGridView1(j, i).Style.BackColor = _
Color.LightSkyBlue
End If
Next
Next
End Sub
' --------------------------------------------------------
// -------------------------------------------------------
// CSVファイルをの差分を表示するサンプル(VB.NET/VS2005)
private void Button1_Click(object sender, EventArgs e)
{
// CSVファイル読込
System.IO.StreamReader sr0 =
new System.IO.StreamReader(
@"D:\Temp\TestCsv1.txt",
Encoding.GetEncoding("Shift-JIS"));
System.IO.StreamReader sr1 =
new System.IO.StreamReader(
@"D:\Temp\TestCsv2.txt",
Encoding.GetEncoding("Shift-JIS"));
String dt0 = sr0.ReadToEnd();
String dt1 = sr1.ReadToEnd();
sr0.Close();
sr1.Close();
// 変更前のデータを行単位分割
dt0 = dt0.Replace("\r\n", "\r");
String[] row0 = dt0.Split('\r');
if (row0[row0.Length - 1] == "")
{
Array.Resize<String>(ref row0, row0.Length - 1);
}
// 変更後のデータを行単位分割
dt1 = dt1.Replace("\r\n", "\r");
String[] row1 = dt1.Split('\r');
if (row1[row1.Length - 1] == "")
{
Array.Resize<String>(ref row1, row1.Length - 1);
}
// 変更前後の行数を合わせる
if (row0.Length > row1.Length)
{
Array.Resize<String>(ref row1, row0.Length);
}
else if (row0.Length < row1.Length)
{
Array.Resize<String>(ref row0, row1.Length);
}
// CSVファイルの差分表示
DataGridView1.Rows.Clear();
for (int i = 0; i <= row0.Length - 1; i++)
{
DataGridView1.Rows.Add();
String[] cel0;
String[] cel1;
// 変更前の行データをセル単位分割
row0[i] = row0[i] + ",,,,";
cel0 = row0[i].Split(',');
Array.Resize<String>(ref cel0, 5);
// 変更後の行データをセル単位分割
row1[i] = row1[i] + ",,,,";
cel1 = row1[i].Split(',');
Array.Resize<String>(ref cel1, 5);
for (int j = 0; j <= cel1.Length - 1; j++)
{
// 変更後データのセルデータ表示
DataGridView1[j, i].Value = cel1[j];
// 変更前後のセルデータ比較
if (cel0[j] != cel1[j])
{
// 変更セルの色変更
DataGridView1[j, i].Style.BackColor =
Color.LightSkyBlue;
}
}
}
}
// -------------------------------------------------------