今年是哪一年?

最近我一直收到很多投诉,说银行对账单转换器导出的CSV结果年份是错的。我最初收到这些投诉时,我很疑惑:“你在说什么?程序所做的只是找到交易数据,将其写入CSV文件并输出。年份怎么会错呢?”。我们就以我的一份汇丰银行对账单为例,看看这到底是怎么回事。

转换后如下图所示

下载后,在文本编辑器(如Sublime Text)中打开,它看起来是这样的。

Date,Transaction Details,Deposit,Withdrawal,Balance
20 Feb,B/F BALANCE,,,"XXX"
27 Feb,CREDIT INTEREST,3.84,,"XXX"

如果在Excel中打开它,它看起来是这样

看一下图像顶部的日期。它的年份设定为2022年,但在CSV中却没有显示年份。Excel是一个自作聪明的混蛋,它自说自话自己添加了今年年份。

这是我们的问题吗?

我可以对我的客户说:“好吧,实际上是Excel它自作主张添加的年份。我们生成的CSV是正确的,这是Excel的问题“。我很想这么说,但我们一定有办法找出银行对账单的正确年份。让我们看看我的汇丰银行对账单的顶部。

这里有一个神秘的无标记日期,上面写着“20 March 2021”。我们不知道它是什么的日期,我们就暂且假设这个日期是“结单日期”或对账单生成的日期。让我们看看我们能否研究出一种方法,向我们目前所有的日期添加正确的年份

例 #1 - 三月

输入
Statement Date: 20 March 2021
Dates: 20 Feb, 27 Feb, 2 Mar, 4 Mar, 9 Mar, 12 Mar, 16 Mar

输出 20 Feb 2021
27 Feb 2021
2 Mar 2021
4 Mar 2021
9 Mar 2021
12 Mar 2021
16 Mar 2021

看上去我们能很快地解决这个问题。我们从结单日期中获取年份,并将其附加到日期中。

例 #2 - 一月

输入 Statement Date: 20 January 2021
Dates: 22 Dec, 24 Dec, 25 Dec, 31 Dec, 2 Jan, 14 Jan

输出 22 Dec 2020
24 Dec 2020
25 Dec 2020
31 Dec 2020
2 Jan 2021
14 Jan 2021

上一个例子的策略在这里行不通。我首先想到的方法是检测交叉点。将所有在交叉点前的日期设置为(结单年-1)年,将交叉点之后的所有日期设置为结单年。但检测交叉点有点烦人。一种方法是先在所有日期上放置一个假年份(临时年份),然后找到“小于”前一个日期的第一个日期。

让我们来看看这个例子。首先,我们在所有的日期上都放了一个假年份:
22 Dec 1999
24 Dec 1999
25 Dec 1999
31 Dec 1999
2 Jan 1999
14 Jan 1999

然后我们找到第一个比前一个日期更早的日期。即“2 Jan 1999”。接着,我们为所有交叉点后的日期(包括交叉点)设置结单年份:

22 Dec 1999
24 Dec 1999
25 Dec 1999
31 Dec 1999
2 Jan 2021
14 Jan 2021

最后,我们为交叉点之前所有的日期设置为结单年份的上一年:

22 Dec 2020
24 Dec 2020
25 Dec 2020
31 Dec 2020
2 Jan 2021
14 Jan 2021

这样挺复杂的,但它能完成任务!不过这种方法感觉确实有点垃圾,如果你感觉这代码有点垃圾,那大概率它就是垃圾

示例 #3 - 一月银行结单,但一月没有转账

输入
Statement Date: 20 January 2021
Dates: 22 Dec, 24 Dec, 25 Dec, 31 Dec

输出 22 Dec 2020
24 Dec 2020
25 Dec 2020
31 Dec 2020

在该数据中没有交叉点。如果我们在脑海里跑一遍我们的代码,程序基本上会将这些日期的年份全部设定为2021年。这不是我们想要的结果。这组数据难倒了我很长时间。我最终还是打电话向我的好朋友Jason Traish求援。他立刻想出了下面的算法。

“假设结账单只能追溯到三个月前。那就先创建前三个月的映射。即1月映射至2021年,12月映射至2020年,11月映射至2020年。然后你再转换日期,从映射中获取正确的年份”

这种方法很管用。这种方法不关心日期的顺序,升序、降序或随机排序的日期都可以。

那么对于被拼接起来的PDF文件呢?

有些人喜欢将多个PDF组合成一个,然后上传到银行对账单转换器。这样通常不会出问题。然而,合并的PDF可能会扰乱我们的年份添加方法。如果一个用户上传一个合并的PDF,其中包含了三年的银行对账单,那该怎么办?我们需要查找多个结单日期,并使用文档中最接近现在的一个。

那么如果有跨越多年的对账单呢?

啊…这个问题还是算了。我承认这个问题存在,但我不认为它们很常见。如果出现这样的问题我再去处理。

是否存在一个通用的解决方案?

有可能会有,但我目前还找不出来。一个使用上述方法的通用解决方案,需要一种通用通用的寻找方法,以找到PDF中所有的结单日期。它还需要一种将年份添加到交易日期的通用方式。也许Jason Traish会想出一个通用的解决方案,在那之前,请容许我继续我的打地鼠解决问题策略——当客户提问时我再解决。

Join The Mailing List