规范化 .bib 文件中的作者姓名

规范化 .bib 文件中的作者姓名

大多数人可能都知道,多种可接受的作者姓名书写方式。但是,当我.bib从 Zotero(有时会导出姓氏、名字,有时会导出名字)或 JabRef(会以您第一次输入的方式导出字段)等软件或互联网导出条目时,我会以多种不同的方式获取作者姓名。虽然这些来源很少以不正确或不可用的方式提供这些姓名,但我希望规范化我的.bib文件,以便我可以Ctrl + F轻松输入作者姓名,如果姓名缩写则填写姓名等等。

.bibtoolrsc我正在尝试使用 BibTool,我已经用它来清理、格式化和排序我的文件。我在我的文件中尝试了以下规则:

new.format.type = {17="%f%v%l%j"}
new.format.type = {17="%0f%0v%0l%0j"}
new.format.type = {17="%0f %0v %0l %0j"}

但是当我运行bibtool命令时,除了这些规则之外,我的所有其他规则都有效(当然,我已经分别尝试过它们)。

以下是我想要的示例。我想要的是这样的:

author = {Brown, Noam and Sandholm, Tuomas}

变成这样:

author = {Noam Brown and Tuomas Sandholm}

有人知道如何实现吗?我更希望使用 BibTool 来做所有事情,但如果有人推荐其他命令,那也是可以接受的。

编辑:这是我的内容我的.bibtoolrsc文件。

答案1

这是我使用 Python 脚本的尝试bibtexparser(注意,它将替换 .bib 文件!如果您不想这样,请修改脚本):

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, sys
import re

import bibtexparser
from bibtexparser.bwriter import BibTexWriter
from bibtexparser.bibdatabase import BibDatabase
from bibtexparser.customization import convert_to_unicode
from bibtexparser.bparser import BibTexParser
import inspect, pprint

# kill stdout terminal buffering
buf_arg = 0
if sys.version_info[0] == 3:
  os.environ['PYTHONUNBUFFERED'] = '1'
  buf_arg = 1
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', buf_arg)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', buf_arg)

# EDIT FOR YOUR FILES - relative to current working dir
mybibfiles = ["path1/file1.bib", "path2/file2.bib"]

numcommas = 0
# homogenize_fields: Sanitize BibTeX field names, for example change `url` to `link` etc.
tbparser = BibTexParser()
tbparser.homogenize_fields = False  # no dice
tbparser.alt_dict['url'] = 'url'    # this finally prevents change 'url' to 'link'

for bibfile in mybibfiles:
  print((bibfile, os.path.isfile(bibfile)))
  with open(bibfile) as bibtex_file:
    bibtex_str = bibtex_file.read()
  bib_database = bibtexparser.loads(bibtex_str, tbparser)
  pprint.pprint(bib_database.entries) # already here, would by default replace 'url' with 'link'!
  bibdblen = len(bib_database.entries)
  for icpbe, paperbibentry in enumerate(bib_database.entries):
    authstr = paperbibentry['author']
    if ("," in authstr):
      numcommas += 1
      report = "%d/%d: Comma present: '%s'"%(icpbe+1, bibdblen, authstr)
      authstrauthors = authstr.split(" and ")
      for ia, author in enumerate(authstrauthors):
        if ("," in author):
          authorparts = author.split(", ")
          # the first part [0] is last name, needs to become last
          # get and remove the first part, then append it as last
          lastname = authorparts.pop(0)
          authorparts.append(lastname)
          authorfirstlast = " ".join(authorparts)
          authstrauthors[ia] = authorfirstlast
      paperbibentry['author'] = " and ".join(authstrauthors)
      bib_database.entries[icpbe] = paperbibentry
      report += " -> '%s'"%(paperbibentry['author'])
    else:
      report = "%d/%d: OK"%(icpbe+1, bibdblen)
    if sys.version_info[0] == 3:
      print(report)
    else: #python 2
      print(report.encode('utf-8'))
  with open(bibfile, 'w') as thebibfile:
    bibtex_str = bibtexparser.dumps(bib_database)
    if sys.version_info[0]<3: # python 2
      thebibfile.write(bibtex_str.encode('utf8'))
    else: #python 3
      thebibfile.write(bibtex_str)

print("\nFound & converted total of %d author fields in format Last, First (with commas)."%(numcommas))

答案2

一年后,在尝试解决同一问题时,我发现 JabRef 在“质量”菜单下有一个名为“清理条目”的选项。如果为“作者”和/或“编辑”字段添加“规范化人名”规则,JabRef 会将姓名规范为“von Last, Jr., First”格式。这与原始问题要求的并不完全一致,但由于它使 bib 文件中所有姓名字段的表示方式均质化,我认为值得一提。

JabRef 还可以通过“质量”>“检查完整性”选项指出哪些条目不符合规格。

它不适用于 Bibtex 扩展名称格式(请参阅biber 手册那是什么)。

相关内容