Haskell:检测不受控制的CSV平面文件中的更改



我正在开发一个应用程序,该应用程序将从零个或多个CSV文件中读取数据,我将其称为"外部"数据。应用程序将在其自己的(SQLite)表中维护派生("内部")数据,这些数据与外部数据中的"行"(行)相关联,以便用户可以插入、删除或更改行,并且派生数据仍将与同一行相关联。如果外部数据是Postgres表,我可以使用行OID将"外部"数据与"内部"数据链接/连接。内部行和外部行之间存在1:1的对应关系。

因此,当应用程序启动时,它将读取外部文件。如果某行已被删除,则相应的内部行将被删除。如果添加了一行,则会向内部数据中添加新行。如果一行已更改,则内部数据将保持不变。外部数据中没有可以假定不会更改的"key"字段。

现在这有点启发式,但正如我所说,我希望能够在外部CSV中检测CRUD,所以我想为每个外部行计算一个256位CRC"指纹",并将其存储在内部SQLite表中。然后,当应用程序启动时,它有一个内部和外部[Integrat],它可以像GNU/Unix/Linuxdiff程序一样进行比较,以检测外部文件中的微小更改。我确实想要两个单独的表:我想允许用户提供"外部"CSV并对其进行更改,但我想控制"内部"表中的内容。

我预计外部数据大约有几百行;比如最多1000个。

因此,我的问题是:是否有任何库可以启发式地比较两个指纹[Interger],并输出添加、删除和更改方面的最小差异列表?或者那个方向的什么?

作为补充,最好有一个相对稳定的指纹算法;也就是说,一个输出只随着输入的轻微变化而略有变化,但这不如上面的主要问题重要。

我的建议是:不要麻烦指纹识别。使用Diff包;您可以指定任何单个记录更改的成本,它将找到最小的整体更改成本(受通常的差异限制:不重新订购等)。

如果你想支持重新排序,你会大大降低效率,但它仍然可以做到。

最新更新