67 lines
2.1 KiB (Stored with Git LFS)
C#
67 lines
2.1 KiB (Stored with Git LFS)
C#
using Newtonsoft.Json.Linq;
|
|
using System.Collections.Generic;
|
|
|
|
public static class GoogleSheetDiffHelper
|
|
{
|
|
public static List<(string Sheet, string Field, int RowIndex, string OldValue, string NewValue)> CompareJsonDiff(string oldJson, string newJson)
|
|
{
|
|
var diffs = new List<(string, string, int, string, string)>();
|
|
|
|
if (string.IsNullOrEmpty(oldJson) || string.IsNullOrEmpty(newJson))
|
|
return diffs;
|
|
|
|
var oldObj = JObject.Parse(oldJson);
|
|
var newObj = JObject.Parse(newJson);
|
|
|
|
foreach (var sheet in newObj)
|
|
{
|
|
var sheetName = sheet.Key;
|
|
if (!oldObj.TryGetValue(sheetName, out var oldSheetToken))
|
|
continue;
|
|
|
|
var oldArray = oldSheetToken as JArray;
|
|
var newArray = sheet.Value as JArray;
|
|
|
|
// Row-by-row 비교 (1번 줄부터 데이터 시작)
|
|
for (int i = 1; i < newArray.Count; i++)
|
|
{
|
|
if (i >= oldArray.Count)
|
|
break;
|
|
|
|
var newRow = (JObject)newArray[i];
|
|
var oldRow = (JObject)oldArray[i];
|
|
|
|
foreach (var prop in newRow.Properties())
|
|
{
|
|
var field = prop.Name;
|
|
string newValue = prop.Value.ToString();
|
|
string oldValue = oldRow.TryGetValue(field, out var oldVal) ? oldVal.ToString() : "";
|
|
|
|
if (oldValue != newValue)
|
|
{
|
|
diffs.Add((sheetName, field, i, oldValue, newValue));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return diffs;
|
|
}
|
|
|
|
public static string GenerateDiff(string oldJson, string newJson)
|
|
{
|
|
var diffs = CompareJsonDiff(oldJson, newJson);
|
|
if (diffs.Count == 0)
|
|
return "No differences found.";
|
|
|
|
var sb = new System.Text.StringBuilder();
|
|
sb.AppendLine("[GoogleSheetManager] 변경된 필드들:");
|
|
|
|
foreach (var (sheet, field, rowIndex, oldVal, newVal) in diffs)
|
|
{
|
|
sb.AppendLine($"{sheet} / Row {rowIndex} / {field} : '{oldVal}' → '{newVal}'");
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
} |