怎么把自己的账从一个 App 里搬出来
导出是一项能力,也是一项权利。什么才算合格的导出、迁移时真正会遇到的编码和格式问题、以及为什么把导出放进订阅是一个关于把柄的设计决定。
记账这件事,只有在时间足够长的时候才产生价值。一个月的记录告诉你伙食花了多少,三年的记录告诉你这个家的开销结构在怎么变化、哪些「固定成本」其实一直在涨、以及你去年这个时候是不是也这么紧。
这就意味着你会把一份越来越贵重的东西,放进一个由别人运营、随时可能涨价、改版、被收购或者干脆关掉的产品里。在这个前提下,「我能不能把它拿出来」不是一个可选的加分项,它是这件事能不能开始的前提。
什么才算一次合格的导出
有一个很硬的判据,比任何宣传语都好用:把数据导出来,再原样导回同一个 App,账本应该完全一致。
这个「往返」如果闭不上,说明导出丢了东西。丢掉的通常是二级分类——很多 App 导出的时候只给一级,于是你精心分的「吃饭 / 外卖」「吃饭 / 买菜」在导出的文件里全变成了「吃饭」。这种导出看起来是完整的,因为每一行账都在;但它其实已经把你花了两年积累的分类结构毁掉了一半。
同样常见的是丢掉「是谁花的」。对单人记账无所谓,对一本家庭账来说,成员信息是这本账区别于流水的核心——没有它,你导出来的只是一堆金额。
所以判据是:往返闭不上的导出,是一种伪装成功能的锁定。它给了你一份看起来能用的文件,让你不去追问,直到你真的想搬家的那一天才发现搬不动。
交出几年数据之前,先核对四件事
- 导出免不免费。这是唯一一条能一眼看出对方立场的。导出是用户离开的通道,把它放到付费墙后面,是一个关于把柄的产品决定,而不是关于成本的决定——生成一个 CSV 文件的边际成本接近于零。
- 导出的是全账还是汇总。「导出报表」和「导出全部记录」是两回事。前者给你一份按月按分类的合计,后者给你每一笔。只有后者能让你换一个工具继续用。
- 格式是不是通用的。CSV 能被 Excel、Numbers、任何一个表格工具、任何一种编程语言读。一个只有它自己能读的私有格式,等于没有导出。
- 包不包含成员、二级分类、备注、时间。这四项是最常被砍掉的。砍掉时间只留日期,会让你没法按「上午还是晚上」看消费模式;砍掉备注,你会失去那些让一本账值得回读的东西——三个超支的月份分别写着「来客人了」和「没什么特别的」,含义完全不同。
真正搬家的时候会遇到什么
这部分很少有人写,因为它不好看。下面是从一个中文记账 App 的导出文件搬到另一个 App 的时候,实际会撞上的几件事。
编码:中文导出经常不是 UTF-8
很多面向中文用户的软件,导出的 CSV 用的是 GB18030 或者它的近亲,而不是 UTF-8。原因是历史的:这样导出的文件用 Excel 双击打开中文不会乱码。代价是任何一个想当然按 UTF-8 读的程序,都会把你的分类名读成一串问号或者方块。
这个坑的恶劣之处在于它不会报错。你的文件被读进去了,行数是对的,金额是对的,只有中文字段坏了——如果你不逐行看,很可能已经导入完成了才发现全部分类名都是乱码。所以一个能同时正确处理 UTF-8 和 GB18030 的导入器,不是锦上添花,它决定了你能不能从中文世界的存量数据里搬出来。Fambook 的导入两种编码都认。
千位分隔符
一万二被写成 12,000。而 CSV 是用逗号分列的。于是这一行凭空多出一列,后面所有字段整体错位。有些导出会给数字加引号,有些不会。一个够用的导入器需要把这种数字识别出来,而不是直接报错跳过。
备注里有真正的换行
你在备注里按了回车,那个换行符会原样进入 CSV 文件。这意味着这个文件不能按行分割来读——一条账可能占物理上的三行。CSV 有正式的规范来处理这种情况(用引号包起来),但很多简易的解析程序是直接按换行切的,于是你的账本会被切碎成一堆残行。
类型写着支出,金额却是负数
这是退款。你买了东西又退了,有些 App 会把它记成一笔「支出 -20」。天真的导入器会得到一笔负二十的支出,然后你的合计就错了两倍的金额。正确的做法是把这种行翻转成一笔收入,并且明确告诉你翻了多少条——因为如果它默默地翻,你就无法判断它的判断对不对。Fambook 的导入会做这个翻转,并且会报出翻转的条数。
同一个文件导了两遍
这几乎一定会发生:第一次导入报了几行错,你改完文件重新导,于是前面成功的那些又进来了一遍。一个负责任的导入需要给每一行算一个指纹——日期、时间、金额、类型、备注——用它来判重。同样,导不进去的行必须给出原因和它在文件里的物理行号,否则你根本没法修。
数据可携:一项在部分法域存在的权利
在欧盟,GDPR 第 20 条规定个人有权以一种结构化的、通用的、机器可读的格式拿到自己提供给服务方的数据。英国有对应的规定,其他一些法域也有相似或者更窄的规则。这里只是陈述这些条款存在,不是对你所处的具体情形下任何结论——你的处境适用什么,取决于你在哪、对方在哪、以及具体是什么服务。
值得指出的是这项权利在实践中的一个限度:它的价值完全取决于导出物是不是真的机器可读。一份把你的账本渲染成 PDF 的「导出」,在字面上可能满足了要求,实际上对搬家毫无用处——你没法把 PDF 导进另一个 App。所以法条给了你一个可以主张的立场,而你真正需要检查的仍然是那个文件本身。
Fambook 的立场,明说
导入和导出都是免费的,而且是刻意免费的。理由前面已经讲过:导出是用户带着自己的数据离开的通道,把它卖掉就是在造陷阱。订阅卖的是省打字的功能,不是访问你自己记录的权限。
导出是 CSV,通过系统的分享面板出来,一笔账一行,包含类型、金额、分类、二级分类、备注、成员、地点、日期和时间。二级分类是特意包含的,就是为了让导出再导回去不丢一层——也就是前面那个往返判据。
导入这一侧前面已经列过了:认 UTF-8 和 GB18030,自己猜哪一列是什么,容忍千位分隔符和备注里的真实换行,把类型与负号矛盾的行翻转过来并报出条数,跳过没法用的行时给出原因和物理行号,并且用每行的指纹去重。这些不是为了好看,是因为真实世界里别的 App 导出的文件就长这样。
不管你用哪个 App,都该做的事
- 每隔几个月导一份出来,放在你自己控制的地方——网盘、电脑、随便哪儿,只要不是只在这个 App 里。这一个动作同时防住了产品关停、账号异常和你自己的误操作。
- 导出之后打开看一眼。看行数对不对,看中文有没有乱码,看二级分类在不在。花两分钟,胜过三年后发现备份是坏的。
- 至少试一次往返:导出,然后导回去(如果这个 App 支持导入的话),看看结果是不是一致。这是你唯一能真正验证导出质量的方法。
- 在你还没积累多少数据的时候就做这件事。搬家的成本随着数据量线性上升,而验证的成本是恒定的。
这些做完之后,你和这个 App 的关系就变了:你继续用它,是因为它好用,而不是因为你走不了。这是你能给自己的记账系统加上的、最有价值的一层保险。
常见问题
怎么判断一个 App 的导出是不是合格的?
看往返能不能闭上:导出来再导回去,账本应该完全一致。闭不上说明丢了东西,最常丢的是二级分类和「谁花的」。这种导出看起来完整——每一笔都在——但你花两年积累的分类结构已经没了一半。
导出要收费的 App 该不该用?
值得非常警惕。生成一个 CSV 的边际成本接近于零,所以把导出放进订阅不是成本决定,是一个关于把柄的产品决定。它告诉你的是:这家公司认为让你难以离开是有价值的。Fambook 的导入导出都免费,而且是刻意的。
为什么导出的中文会乱码?
因为很多面向中文用户的软件导出的是 GB18030 而不是 UTF-8,这样 Excel 双击打开不乱码。而任何按 UTF-8 读的程序都会把中文读成问号或方块,还不报错——行数对、金额对,只有中文坏了。导入器必须两种编码都认。
同一个文件不小心导了两遍怎么办?
这几乎一定会发生,因为第一次总有几行报错、你改完重导。所以导入需要给每行算一个指纹——日期、时间、金额、类型、备注——用它判重。Fambook 这么做。如果一个 App 没有去重,你就得自己在导入前把文件裁好。
GDPR 第 20 条能保证我拿到数据吗?
在适用它的法域,它规定了以结构化、通用、机器可读格式取得自己提供的数据的权利,英国和其他一些地方有相似规定。这里只陈述这些条款存在,不对你的具体情形下结论。实践中的限度是:一份 PDF 可能字面上满足要求,却完全没法导进另一个 App。
多久该备份一次?
每隔几个月一次,导完打开看一眼行数、中文和二级分类在不在。在数据还少的时候就开始做——搬家成本随数据量上升,验证成本是恒定的,所以越早验越便宜。
拿一个月试一遍
Fambook 给一家人一本共享的账:谁都能几秒钟记一笔,每笔都写着是谁花的,一个月的账加总在一处,而不是两处。没信号照记,有网再同步。记账、分类、预算、统计、CSV 导入导出、云同步,以及两人共享,全都免费——订阅买到的只是「少打点字」。