【问题标题】:Compare two csv files in C#在 C# 中比较两个 csv 文件
【发布时间】:2018-03-23 03:34:39
【问题描述】:

我想比较两个 csv 文件并打印文件中的差异。我目前使用下面的代码来删除一行。我可以更改此代码以便比较两个 csv 文件还是在 c# 中有更好的方法来比较 csv 文件?

  List<string> lines = new List<string>();
        using (StreamReader reader = new StreamReader(System.IO.File.OpenRead(path)))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                if (line.Contains(csvseperator))
                {
                     string[] split = line.Split(Convert.ToChar(scheidingsteken));

                    if (split[selectedRow] == value)
                    {

                    }
                    else
                    {
                        line = string.Join(csvseperator, split);
                        lines.Add(line);
                    }
                }

            }
        }

        using (StreamWriter writer = new StreamWriter(path, false))
        {
            foreach (string line in lines)
                writer.WriteLine(line);
        }
    }

【问题讨论】:

  • 如果您想找出added、deleted和changed行,请查看编辑距离 en.wikipedia.org/wiki/Edit_distance
  • 我不能用那个。
  • 你为什么这么难过?为什么你不能使用它?最简单的编辑距离(Levenshtein之一)很容易实现en.wikipedia.org/wiki/Levenshtein_distance
  • 你真的不应该在你的代码中使用空的if 块。改变条件可以解决这个问题。
  • 当两个 CSV 文件包含完全相同的数据但顺序不同时,您希望程序输出什么?另外,记录是否需要 100% 匹配?还是1,Pete,2 等于1,"Pete",2?

标签: c# csv


【解决方案1】:

这是另一种查找 CSV 文件之间差异的方法,使用 Cinchoo ETL - 一个开源库

对于以下示例 CSV 文件

sample1.csv

id,name
1,Tom
2,Mark
3,Angie

sample2.csv

id,name
1,Tom
2,Mark
4,Lu

方法 1:

使用 Cinchoo ETL,下面的代码显示了如何按所有列查找行之间的差异

var input1 = new ChoCSVReader("sample1.csv").WithFirstLineHeader().ToArray();
var input2 = new ChoCSVReader("sample2.csv").WithFirstLineHeader().ToArray();

using (var output = new ChoCSVWriter("sampleDiff.csv").WithFirstLineHeader())
{
    output.Write(input1.OfType<ChoDynamicObject>().Except(input2.OfType<ChoDynamicObject>(), ChoDynamicObjectEqualityComparer.Default));
    output.Write(input2.OfType<ChoDynamicObject>().Except(input1.OfType<ChoDynamicObject>(), ChoDynamicObjectEqualityComparer.Default));
}

sampleDiff.csv

id,name
3,Angie
4,Lu

小提琴示例: https://dotnetfiddle.net/nwLeJ2

方法 2:

如果你想通过id 列做差异,

var input1 = new ChoCSVReader("sample1.csv").WithFirstLineHeader().ToArray();
var input2 = new ChoCSVReader("sample2.csv").WithFirstLineHeader().ToArray();

using (var output = new ChoCSVWriter("sampleDiff.csv").WithFirstLineHeader())
{
    output.Write(input1.OfType<ChoDynamicObject>().Except(input2.OfType<ChoDynamicObject>(), new ChoDynamicObjectEqualityComparer(new string[] { "id" })));
    output.Write(input2.OfType<ChoDynamicObject>().Except(input1.OfType<ChoDynamicObject>(), new ChoDynamicObjectEqualityComparer(new string[] { "id" })));
}

小提琴示例: https://dotnetfiddle.net/t6mmJW

【讨论】:

  • 这是一个很棒的工具。谢谢你。就我而言,我有一个“主”CSV 文件和一个“详细”CSV 文件。在 CSV 1 是主文件而 CSV 2 是输出文件的详细信息时,我该如何做同样的事情,说记录“3”已被“删除”并且记录“4”是新的?显然是一个新的列来显示这种状态。您能否在答案中添加一个示例?哦,我的 CSV 有一个唯一的 ID 列,就像你的样本一样。赞赏。
  • @Cinchoo 结果文件存储在哪里?
  • 可以路由到文件、流等
【解决方案2】:

如果您只想比较一列,可以使用以下代码:

                List<string> lines = new List<string>();
    List<string> lines2 = new List<string>();



    try
    {
        StreamReader reader = new StreamReader(System.IO.File.OpenRead(pad));
        StreamReader read = new StreamReader(System.IO.File.OpenRead(pad2));

        string line;
        string line2;

        //With this you can change the cells you want to compair
        int comp1 = 1;
        int comp2 = 1;

        while ((line = reader.ReadLine()) != null && (line2 = read.ReadLine()) != null)
        {           
            string[] split = line.Split(Convert.ToChar(seperator));
            string[] split2 = line2.Split(Convert.ToChar(seperator));

            if (line.Contains(seperator) && line2.Contains(seperator))
            {
                if (split[comp1] != split2[comp2])
                {
                    //It is not the same
                }
                else
                {
                    //It is the same

                }
            }
        }
        reader.Dispose();
        read.Dispose();
    }
    catch
    {

    }

【讨论】:

  • 这只检查每行的第二列,如果一个 CSV 包含的行多于另一个,则忽略行。
  • 我该如何解决这个问题?
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多