最近几个月,我开始使用一款新的双链笔记软件 Logseq。由于其有别于传统树形结构的文档软件的强大的连接知识的能力,我对它的使用越来越重度,并逐渐将散落在其他 app 中的数据迁移到 Logseq 中来。今天要迁移的是多年以前在 Day One 中记录的日记。

迁移思路

Day One 的数据支持多种格式的导出,包括 JSON、纯文本和 CSV。由于 JSON 格式需要理解其 schema,纯文本又比较难解析,因此我决定使用 CSV 格式进行导出。大体思路如下:

  • 在 Day One app 中,选择使用 CSV 格式(包含媒体)导出
  • 导出的文件发送到电脑端,解压缩
  • 将 “photos” 媒体文件夹中的全部内容复制到 Logseq 的 “assets” 媒体文件夹,这里应该不会有文件名冲突,因为 Day One 导出的媒体文件名称是其 MD5 哈希值(可理解成为一个文件的唯一编码)+后缀
  • 将导出得到的 csv 文件放置在 Logseq 的 journal 目录下
  • 在 journal 目录下写一个 Python 脚本,解析 Day One 导出的 CSV 文件,在其中读取到日记日期、文本内容和关联的媒体文件名称,然后创建与 Logseq 的 journal 相同的文件名格式的文件,如果已经存在,则在文件末尾追加内容

迁移脚本编写

说干就干,很快我就写出来了如下脚本,不得不说 Python 的开发效率确实高得出奇。你可以直接抄我写的如下脚本,命名为 migrate.py,修改其中的 csv 文件名就可以运行了:

import os
import csv
import datetime

photos = os.listdir("../assets")

print(photos)

def get_photo_filename(md5_digest: str):
    for filename in photos:
        if filename.startswith(md5_digest):
            return filename
    return None

with open("2021-2-5-日记本.csv") as f:
    reader = csv.reader(f)
    is_first_line = True
    for line in reader:
        if is_first_line:
            is_first_line = False
            continue

        date = datetime.datetime.strptime(line[0], '%Y-%m-%dT%H:%M:%S.%fZ') + datetime.timedelta(hours=8)
        md_filename = str(date.year) + '_' + str(date.month) + '_' + str(date.day) + '.md'
        content = '\n'+line[1]
        if line[-1] != '':
            media_md5s = line[-1].split(", ")
            for item in media_md5s:
                photo_filename = get_photo_filename(item)
                if not photo_filename:
                    print(f"{md_filename}: {item} not found")
                    continue
                line = f'![{photo_filename}](../assets/{photo_filename})'
                content += '\n' + line
        with open(md_filename, "a") as f2:
            f2.write(content)

完成迁移

在终端中来到 journal 文件夹,输入 python migrate.py 命令,回车执行。你的 Day One 日记就会合并到 Logseq 的 journal 中啦!(在执行前先完整备份 Logseq 文件夹,以防万一!)

需要注意的是,如果你看到了诸如 xxx not found 的错误提示,这代表有日记中包含的图片不在 Day One 导出的结果中,无法被导入。根据提示中的日期回到 Day One app,发现图片右下角有一个标记,点击图片会提示“找不到此媒体”。

这种情况说明在 Day One 的服务端也已经丢失了这张图片,只能联系他们的客服看能不能找回来。我隐约记得两年前因为这种问题找过他们客服,最后也没有恢复。

这再次说明了云笔记的危险性,一旦 app 的服务器端自身存在一些 bug 或运维事故导致图片丢失,并且他们也没有良好的备份机制,你的内容就再也找不回来了。因此,对于比较专业的用户来说,还是推荐“本地优先”并且使用“3、2、1备份策略”备份你的文件。


玩物生智”是本博客的一个频道。我会在此分享一系列普通人在使用计算机等电子产品时会遇到的问题,以及对应的清晰易懂的解决方案。力求让技术为我们服务,提升个人使用电子产品的使用体验。如果你对此感兴趣,不妨在下方订阅本站的邮件简报,或在 RSS 阅读器中添加本站点以获得及时更新。

5 1 投票
喜欢这篇文章吗?
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
你也许会喜欢