KindleMate2 icon indicating copy to clipboard operation
KindleMate2 copied to clipboard

Kindle标注导出为CSV或者其他Anki可以接受的格式

Open lzcapp opened this issue 1 year ago • 10 comments

@Steven630 在 #6 提出:

Kindle标注能导出成CSV或者其他anki可以接受的格式吗?

lzcapp avatar Nov 25 '24 01:11 lzcapp

谢谢大佬,原帖已经回复https://github.com/lzcapp/KindleMate2/issues/6#issuecomment-2496549724

在这里补充一下,根据anki的说明,CSV文件最开始几行可以加上header,这样Anki在导入的时候能直接根据header设置相应格式和选项

方式是 #key:value

比如 #separator:Comma #html:true #columns:Front,Back #notetype:Test #deck:Chinese

这表示文件的列是用逗号分隔的(这个可以和导出时的分隔符一致,还可以是Tab、Semicolon等等),html格式启用,notetype是Test,牌组是Chinese。

所有header支持的key和value在这里: https://docs.ankiweb.net/importing/text-files.html#file-headers

要是可以让用户在导出前设定header就更好了,这样Anki导入的时候直接都设置好了。

Steven630 avatar Nov 25 '24 02:11 Steven630

image

lzcapp avatar Nov 25 '24 03:11 lzcapp

@Steven630 也就是说先不管headers,我至少需要做到导出一个csv文件,这样在Anki中就能一一对应和导入了?

lzcapp avatar Nov 25 '24 03:11 lzcapp

是的,有了CSV就可以。CSV建议所有的元素都单独成列,用户在Anki导入的时候选择哪些需要、对应到哪个field就可以了。

单词也是一样的(单词、原形、上下文、书籍、作者、语言、时间等等信息都各为一列)。以前的Kindle Mate生词本应该是有导出为CSV功能的,标注没试过。

Steven630 avatar Nov 25 '24 03:11 Steven630

image

截图左边是用户Anki卡片自带的fields,右边可选的就是CSV每列的表头,标注导出功能实现后。Anki导入界面右边这栏就可以自主选择“标记内容”、“书名”、“位置”等等,也可以选择nothing跳过。

目前需要的第一步只是把那些信息都变成一个大CSV。

Steven630 avatar Nov 25 '24 03:11 Steven630

Screenshot_20241125_120037.jpg

Screenshot_20241125_120136.jpg

第一张截图是用Python把生词本转换为CSV格式的做法,第二张就是Anki导入相应CSV的界面。

    with open(export_path, 'w', newline='', encoding='utf-8') as csvfile:
        # Write Anki import settings as headers
        csvfile.write("#separator:Comma\n")
        csvfile.write("#html:true\n")
        csvfile.write("#tags:\n")
        csvfile.write("#columns:Front,Back,AI\n")
        csvfile.write(f"#notetype:{notetype}\n")
        csvfile.write(f"#deck:{deck}\n")
        csvfile.write("#notetype column:\n")
        csvfile.write("#deck column:\n")
        csvfile.write("#tags column:\n")
        csvfile.write("#guid column:\n")
        csvfile.write("#existing notes:duplicate\n")
        csvfile.write("#match scope:notetype and deck\n")

        # Write data rows
        writer = csv.writer(csvfile)
        for word in words:
            # Map fields to values
            front = word[3]  # 'stem'
            back = word[1]  # 'usage'
            ai = word[6]

            # Write row
            writer.writerow([front, back, ai, notetype, deck])

Steven630 avatar Nov 25 '24 04:11 Steven630

根据上面的代码,似乎是要加一行表示各列内容的header才行,否则Anki不一定能识别

csvfile.write("#columns:Front,Back,AI\n")

Steven630 avatar Nov 25 '24 04:11 Steven630

大佬,这个功能大概什么时候有望实现呀😊@lzcapp

Steven630 avatar Dec 15 '24 11:12 Steven630

@Steven630 说实话最近有点忙🤣,我打算是先把那个导入的问题解决了,然后再实现这些feature。

lzcapp avatar Dec 16 '24 01:12 lzcapp

好的好的,辛苦啦

Steven630 avatar Dec 16 '24 03:12 Steven630