如何解析和替换大型 csv 文件中不正确的世纪外日期值

本文关键字:日期 不正确 何解析 替换 大型 文件 csv | 更新日期: 2023-09-27 18:33:53

我处于一种尴尬的搜索和替换状态。我正在为我的雇主开发一个新的数据库,现在正在将旧数据导入新的MySQL数据库。我处于十字路口的问题是旧数据库是一个名为 PC-File 的 LEGACY 数据库,它使用了.dbf文件,所以我找到了一个 dbf 查看器,它允许我将信息导出到.csv文件中,但是,特别是一个文件,有超过 5000 条世纪日期不正确的数据记录......而不是显示 12/28/2012 - 它将显示 12/28/1998。我在互联网上上下搜索,试图找到一种方法来解析"01/01/1900 - 01/01/1914"年份范围之间的日期信息,并将"19"替换为"20"。我无济于事,无法找到成功的解决方案。

我希望我的问题清楚就足够了....

我对excel,C#,vb.net 和MySQL的解决方案持开放态度;任何意见或建议将不胜感激。

这是我的 .CSV 文件:

    "CUSTOMER","ORDER_DATE"
    670,"4/18/1913"
    670,"6/25/1913"
    670,"6/25/1913"
    667,"9/18/1912"
    665,"9/14/1912"
    664,"12/8/1920"
    664,"12/8/1920"
    658,"9/23/1911"
    658,"2/6/1912"
    655,"5/11/1911"
    651,"12/10/1910"
    651,"12/10/1910"
    651,"12/14/1910"
    648,"6/2/1910"
    648,"6/2/1910"
    648,"6/2/1910"
    648,"6/2/1910"

谢谢你们的任何反馈或提示。

如何解析和替换大型 csv 文件中不正确的世纪外日期值

如果你在数据库中有它,请运行以下 SQL

MySQL 解决方案:

update myTable
set ORDER_DATE = DATE_ADD(ORDER_DATE, INTERVAL 100 YEAR)
where ORDER_DATE between '1900-01-01' and '1914-01-01'; /* Change this cutoff date range as appropriate */

无论您使用哪种技术,逻辑都是相同的;选择日期具有错误年份的所有记录,然后通过添加 100 年进行更正。

Excel 解决方案是:

=IF(AND(A1>=DATE(1900,1,1),A1<=DATE(1914,1,1)),DATE(YEAR(A1)+100,MONTH(A1),DAY(A1)),A1)

其中 A 列包含日期值。

您应该能够以任何方式解析日期,检查它们是否在您指定的 1900-1914 范围内,并将"19"替换为"20"。以下是处理解析和后续替换为正则表达式的一种方法:

string brokenDate = "648,'"12/10/1912'"";
System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(brokenDate, @"('d{1,2}/'d{1,2}/)19(?=(0[0-9]|1[0-4]))");
string fixedDate = m.Groups[1].Value + "20" + m.Groups[2].Value;

如果需要,您还可以更改正则表达式以返回整行,而不是像我所做的那样仅返回固定日期。或者正如其他人建议的那样,应该可以对其进行一些修改,以便一次性修复整个文件。