我试图比较SQL查询中的两个大数据集。 现在,SQL查询是在外部完成的,每个数据集的结果都保存在自己的csv文件中。 我的小C#控制台应用程序加载两个text / csv文件,并将它们与差异进行比较,并将差异保存到文本文件中。

它是一个非常简单的应用程序,它只是将第一个文件中的所有数据加载到arraylist中,并在arraylist上执行.compare(),因为每行都是从第二个csv文件中读取的。 然后保存不匹配的记录。

该应用程序有效,但我想提高性能。 我想我可以大大提高性能,如果我可以利用两个文件都已排序的事实,但我不知道C#中保持顺序的数据类型,并允许我选择一个特定的位置。 这是一个基本数组,但我不知道每个列表中有多少项。 我可以有超过一百万条记录。 是否有可用的数据类型我应该查看?

===============>>#1 票数:2

如果两个CSV文件中的数据已经排序并且具有相同数量的记录,则可以完全跳过数据结构并进行就地分析。

StreamReader one = new StreamReader("C:\file1.csv");
StreamReader two = new StreamReader("C:\file2.csv");
String lineOne;
String lineTwo;

StreamWriter differences = new StreamWriter("Output.csv");
while (!one.EndOfStream)
{
    lineOne = one.ReadLine();
    lineTwo = two.ReadLine();
    // do your comparison.
    bool areDifferent = true;

    if (areDifferent)
        differences.WriteLine(lineOne + lineTwo);
}

one.Close();
two.Close();
differences.Close();

===============>>#2 票数:1

System.Collections.Specialized.StringCollection允许您添加一系列值,并使用.IndexOf(字符串)方法,允许您检索该项的索引。

话虽这么说,你可能只是从文件流加载几个byte []并进行字节比较......甚至不用担心将这些东西加载到像StringCollection或string []这样的正式数据结构中; 如果您所做的只是检查差异,并且您想要速度,我会想到字节差异就在它的位置。

===============>>#3 票数:1

这是David Sokol的代码改编,用于处理不同数量的行,输出一个文件而不是另一个文件中的行:

StreamReader one = new StreamReader("C:\file1.csv");
StreamReader two = new StreamReader("C:\file2.csv");
String lineOne;
String lineTwo;
StreamWriter differences = new StreamWriter("Output.csv");
lineOne = one.ReadLine();
lineTwo = two.ReadLine();
while (!one.EndOfStream || !two.EndOfStream)
{
  if(lineOne == lineTwo)
  {
    // lines match, read next line from each and continue
    lineOne = one.ReadLine();
    lineTwo = two.ReadLine();
    continue;
  }
  if(two.EndOfStream || lineOne < lineTwo)
  {
    differences.WriteLine(lineOne);
    lineOne = one.ReadLine();
  }
  if(one.EndOfStream || lineTwo < lineOne)
  {
    differences.WriteLine(lineTwo);
    lineTwo = two.ReadLine();
  }
}

关于代码写在我头顶的标准警告适用 - 你可能需要特殊情况下一行中没有行,而另一行仍然有行,但我认为这种基本方法应该做你想要的。

===============>>#4 票数:0

那么,有几种方法可行。 您可以编写自己的数据结构来执行此操作。 或者您可以尝试使用SortedList。 您还可以在代码中返回DataSet,然后在表上使用.Select()。 当然,您必须在两个表上执行此操作。

===============>>#5 票数:0

您可以轻松使用SortedList进行快速查找。 如果要加载的数据已经排序,则对SortedList的插入不应该很慢。

===============>>#6 票数:0

如果您只想查看FileA中的所有行是否都包含在FileB中,您可以读取它并仅比较循环内的流。

文件1 Entry1 Entry2 Entry3

文件2 Entry1 Entry3

您可以通过两个计数器循环查找遗漏,逐行浏览每个文件,看看是否得到了您需要的东西。

===============>>#7 票数:0

也许我误解了,但ArrayList将按照添加它们的顺序维护其元素。 这意味着您只能在一次通过中比较两个ArrayLists - 只需根据比较结果递增两个扫描索引。

===============>>#8 票数:0

我有一个问题是你考虑过“外包”你的比较。 有很多很好的差异工具,你可以呼吁。 如果没有一个允许你指定两个文件并且只获得差异,我会感到惊讶。 只是一个想法。

===============>>#9 票数:0

我认为每个人都有这么多不同答案的原因是你没有完全指出你的问题得到回答。 首先,它取决于您想要跟踪的差异。 您是否希望在WinDiff中输出差异,其中第一个文件是“原始”,第二个文件是“已修改”,因此您可以将更改列为INSERT,UPDATE或DELETE? 您是否有一个主键,允许您将两行匹配为同一记录的不同版本(当主键以外的字段不同时)? 或者这是某种和解,你只是希望你的差异输出说“记录在文件1而不是文件2”?

我认为这些问题的答案将帮助每个人为您的问题提供合适的答案。

===============>>#10 票数:0

如果你有两个文件,每个文件都是你的帖子中提到的一百万行,你可能会耗费大量内存。 某些性能问题可能是您正在从磁盘交换。 如果您只是将文件A的第1行与文件B,第2行文件A - >第2行文件B等的第一行进行比较,我建议使用一种不会在内存中存储太多的技术。 你可以读取两个文件流的注销,就像之前发布的评论者一样,并在你找到它们时“实时”写出你的结果。 这不会在内存中明确存储任何内容。 你也可以将每个文件的块转储到内存中,比如一次说一千行,就像List一样。 这可以很好地调整,以满足您的需求。

===============>>#11 票数:0

要解决问题#1,我建议您考虑创建每行的哈希值。 这样,您可以使用字典快速轻松地比较哈希。

要解决问题#2,一个快速而肮脏的解决方案是使用IDictionary。 使用itemId作为第一个字符串类型,将行的其余部分用作第二个字符串类型。 然后,您可以快速查找itemId是否存在并比较这些行。 这当然假设.Net 2.0+

  ask by MaxGeek translate from so

未解决问题?本站智能推荐:

4回复

C#中两个字符串值的数据类型的相等比较

我有一个奇怪的要求。 我知道,即使我的问题也令人困惑。 这是我想知道的。 我有两个字符串变量。 我需要对字符串变量中基础值的数据类型进行相等比较。 对于前。 现在,我需要比较这两个字符串的基础值的数据类型是否相同。 我怎样才能做到这一点? 更新:感谢大家的澄清和答复
1回复

在C#中比较包括基类型的类型

如果我捕获异常,它也会捕获类型及其基类型: 但是如何以相同的方式比较类型? 我知道我可以看Type.BaseType ,但是如何匹配类型包括它的基类型树是不是最简单的方法?
1回复

c#在运行时检查两个对象是否具有可比性

我试图理解反思的机制。 我想比较一个对象的属性与给定的值。 现在,我希望能够知道(当然在运行时)两个对象是否具有可比性,而不是执行比较并捕获异常。 就像是: 当然我知道这是无效的,因为必须在编译时知道泛型。 我想知道这种行为是否可以在C#中实现。 谢谢
4回复

C#当类的类型为Generic时,如何访问类的元素? [重复]

可能重复: C#如何比较两个对象,如果它们是相同的类型? 我有一个通用功能, 在此先感谢您提供的所有帮助!
2回复

在一个数组或列表中查找类型相等并执行操作。 C#

我如何在一个数组中找到类型相等。 或列出我正在使用这些类: 我有Par作为Expression数组类型 但是一个索引也可以是VarExpression或ConstExpression类型...或者只是Expression 因为VarExpression和ConstExpre
1回复

比较C#中的盒装对象

是否可以在编译时比较两个对象而不知道它们的盒装类型? 例如,如果我有一个object{long}和object{int} ,有没有办法知道盒装值是否相等? 我的方法检索两个通用object ,并且在编译时无法知道它们的内部类型是什么。 现在,通过以下代码进行比较: 其中,例如_
7回复

无法将T值1与T值2 = default(T)进行比较。 为什么以及如何在C#上做到这一点?

我正在尝试以下方法: 那么,如何比较这两个值? 为什么会发生此错误? 提前致谢!
1回复

检查两种类型是否相同

我有一个未知类型的对象。 我正在尝试查看它是否为特定类型。 我努力了: 和 但它们都不起作用。 如何检查对象是否具有特定类型? 我需要找出它是否是确切的类型,而不是该类型的超类/子类。 在Windows Phone 8.1中,我试图查看发送方是从哪个类发送的。
2回复

确定对象是否来自特定类型?

我正在寻找is运算符,除了类型操作数(右)是动态的。 有没有更简单的方法呢? 我尝试使用IsAssignableFrom ,但它似乎没有工作 :
5回复

比较类型的VALUE和REFERENCE

我知道有很多方法可以在C#中比较VALUE和REFERENCES,但是当您尝试比较VALUE或REFERENCE时,对于哪种类型执行什么仍然有些困惑。 字符串示例: