文本文件

原文:Text Files - Anki Manual (ankiweb.net)

任何包含以逗号、分号或制表符分隔字段的纯文本文件都可以导入到 Anki,前提是满足一些条件。

  • 文件必须是纯文本(如 myfile.txt)。其他格式如 myfile.xls、myfile.rtf、myfile.doc 必须先保存为纯文 本文件。

  • 文件必须是 UTF-8 格式(见下文)。

  • 第一行还定义了分隔符号 —— 如果 Anki 在第一行找到 ';',它将使用该符号,如果找到逗号,也会使用逗号 等。

  • Anki 通过查看文件的第一行(非注释行)来确定文件中的字段数量。如果文件中的某些记录包含较少的字 段,Anki 会将缺失的字段视为空白处理。如果某些记录包含额外字段,额外的内容将不会被导入。

文本文件中的字段可以映射到笔记中的任何字段,包括标签字段。导入时可以选择文本文件中的哪个字段对应于笔 记中的哪个字段。

导入文本文件时,可以选择将卡片放入哪个牌组。请记住,如果你的模板中设置了牌组覆盖选项,卡片将转入该牌 组而不是你选择的牌组。

这是一个包含三个字段的有效文件示例:

apple;banana;grape
some text;other text;yet more text

有两种方式在字段中包含换行符或字段分隔符。

通过将字段内容放在直角引号中来转义字符

hello;"this is
a two line answer"
two;this is a one line field
"this includes a ; (semicolon)";another field

由于使用引号来标记字段的开始和结束,如果希望在字段中包含引号,需要用两个双引号替换一个双引号来「转 义」它们,如下所示:

field one;"field two with ""escaped quotes"" inside it"

当使用像 Libreoffice 的电子表格程序为你创建 CSV 文件时,它将自动处理双引号的转义。

使用 HTML 换行

hello; this is<br>a two line answer
two; this is a one line one

你需要在导入对话框中勾选「允许 HTML 字段」选项,HTML 换行才能生效。

如果使用包含多行的闭合删除,它们将无法正确工作。在这种情况下,请使用 HTML 换行。

你也可以在另一个字段中包含标签,并在导入对话框中选择该字段作为标签字段:

first field;second field;tags

这是一个有效文件的示例,其中第一行被忽略(#):

# this is a comment and is ignored
foo bar;bar baz;baz quux
field1;field2;field3

电子表格和 UTF-8

如果文件中包含非拉丁字符(如重音符号、日语等),Anki 期望文件以「UTF-8 编码」保存。使用免费的 LibreOffice 电子表格程序而不是 Excel 来编辑文件是最简单的方法,因为它轻松支持 UTF-8,同时还可以正确 导出多行内容,而 Excel 则不行。如果你仍想使用 Excel,请参阅 这个论坛帖子 获取更多信息。

要使用 LibreOffice 将电子表格保存为 Anki 可以读取的文件,请转到文件> 另存为,然后选择 CSV 作为文 件类型。在接受默认选项后,LibreOffice 会保存文件,然后你可以将保存的文件导入到 Anki。

HTML

Anki 可以将从文本文件中导入的文本视为 HTML(用于网页的语言)。这意味着带有粗体、倾斜和其他格式的文本 可以导出到文本文件并再次导入。如果要包含 HTML 格式,可以在导入时勾选「在字段中允许 HTML」选项。如果 试图导入内容包含尖括号或其他 HTML 语法的卡片,你可能希望关闭此选项。

如果希望在文件中使用 HTML 进行格式化,同时还希望包含尖括号或和号,可以使用以下替换:

字符替换符
<&lt;
>&gt;
&&amp;

导入媒体

如果希望从文本文件导入时包含音频和图片,请将这些文件复制到 collection.media 文件夹不要在媒体文件夹中放置子目录,否则部分功能将无法正常工 作。

在复制文件后,按以下方式更改文本文件中的一个字段。

<img src="myimage.jpg">

[sound:myaudio.mp3]

或者,你可以在浏览界面中使用查找和替换功能一次性更新所有字段。如果每个字段都包含如 「myaudio」的文本,且希望让它播放声音,可以搜索 (.*) 并替换为 "[sound:\1.mp3]",同时启用「正则表 达式」选项。

当导入包含这些引用的文本文件时,必须确保启用「允许 HTML」选项。

你可能会想在模板中这样做,如:

<img src="{{field name}}">

Anki 不支持这种做法,原因有两个:搜索使用的媒体消耗资源,因为每张卡片都必须被渲染,而此类功能对于共 享牌组的用户来说并不明显。请改用查找和替换技术。

批量媒体

批量导入大量媒体的另一种选择是使用媒体导入插件。此插件 会自动为你选择的文件夹中的所有文件创建笔记,文件名前部内容(去掉文件扩展名后,如 apple.jpg,则前部为 "apple")位于正面,图片或音频在背面。如果你希望媒体和文件名的安排不同,之后可 以更改创建的卡片的笔记模板

添加标签

如果你想为导入的每一行添加「tag1」和「tag2」,请在文本文件的开头添加以下内容:

tags:tag1 tag2

重复和更新

在导入文本文件时,Anki 使用第一个字段来确定一条笔记是否唯一。默认情况下,如果导入的文件的第一个字段 与集合中的现有笔记匹配,并且该笔记的模板与导入的模板相同,则现有笔记的其他字段将根据导入文件的内容进 行更新。导入界面中的下拉框允许你更改此行为,可以完全忽略重复,或将它们作为新笔记导入而非更新现有笔 记。

「匹配范围」设置控制如何识别重复。当选择「notetype」时,如果另一条笔记具有相同的 notetype 且第一个字 段相同,Anki 将识别为重复。当设置为「笔记模板和牌组」时,只有在现有笔记也在你要导入的牌组中时才会标 记为重复。

如果你开启了更新并且已在集合中存在你导入的笔记的旧版本,它们将更新就地(在当前牌组中),而不是移动到 你在导入对话框中设置的牌组中。如果笔记进行原位更新,它们的卡片上的现有安排信息将被保留。

有关 .apkg 文件中如何处理重复的信息,请参阅牌组包部分。

文件标题

Anki 2.1.54+支持可以包含在文本文件中的某些标题以使导入更强大或更方便。它们由 #键:值 对组成,必须单 独列在文件顶部的各行中,尽管标签行可以在它们之前。由于标题行以注释字符 # 开始,早期的 Anki 客户端将只会忽略它们。

你必须在首选项界面中启用新的导入选项才能在 2.1.54 上使用此功能。在 2.1.55 上,新的导入路径是默认路 径。

允许值行为
separator逗号, 分号, 制表符, 空格, 竖线符, 冒号 或相应的文字字符确定字段分隔符。
htmltrue, false确定文件是否被视为 HTML。
tags用空格分隔的标签列表旧语法
columns用先前设置的分隔符分隔的名称列表确定列数并在导入时显示其给定名称。
notetype笔记模板名称或 id如果存在,则预设笔记模板。
deck牌组名称或 id如果存在,则预设牌组。
notetype column1, 2, 3, ...确定哪一列包含每个笔记的笔记模板名称或 id,见笔记模板列
deck column1, 2, 3, ...确定哪一列包含每个笔记的牌组名称或 id,见牌组列
tags column1, 2, 3, ...确定哪一列包含每个笔记的标签。
guid column1, 2, 3, ...确定哪一列包含每个笔记的 GUID,见GUID 列

一些标题有进一步的影响。

笔记模板列

通常,文件中的所有笔记都会映射到单一笔记模板,你可以选择哪个列映射到该笔记模板的哪个字段。

然而,如果有一列包含笔记模板名称或 id 时,这就会发生变化。这允许导入不同笔记模板的笔记,其字段将隐含 映射:第一个常规列用于任何笔记的第一个字段,无论其笔记模板是什么,第二个常规列用于第二个字段,依此类 推。这里所说的「常规列」是指不包含特殊信息的列,比如牌组、标签、笔记模板或 GUID。

牌组列

通常,导入文本文件产生的任何新卡片都会放置在你选择的单一牌组中。如果文件中包含牌组列,则新笔记的卡片 将放置在其指定的牌组中。如果牌组不存在,将创建一个具有给定名称的牌组。

GUID 列

GUID 代表全局唯一标识符。当你在 Anki 中创建笔记时,Anki 为每个笔记分配一个唯一 ID,可以用于重复检 查。如果你导出笔记时包含 GUID,你可以对笔记进行更改,并且只要不修改 GUID 字段,你就可以重新导入笔记 以更新现有笔记。

请注意,GUID 旨在由 Anki 创建。如果你正在创建自己的 ID,比如 MYNOTE0001,建议将 ID 放在第一个字段 中,而不是将它们分配给 Anki 的内部 GUID。导入时,Anki 可以使用第一个字段或 GUID 进行重复检查,因此你 不需要将 ID 制作成 GUID 以便能够更新笔记。

需要注意的另一件事是,对于具有非空 GUID 的行,「重复」选项将不起作用。如果提供了 GUID,并且在集合中 已经存在,将不会创建重复。