bibtex - 更改 urldate 的格式

bibtex - 更改 urldate 的格式

我遇到的问题是,我使用引文管理器 Citavi,它只能以 格式导出urldate = {dd.mm.yyyy}。但是 Bibtex 需要 格式urldate = {yyyy-mm-dd}。对我来说,手动更改参考书目所有日期并不现实,因为我有很多条目,每次导出后我都需要重做。

例如我的 bibtex 条目如下所示:

@Misc{FAO.2011,
  Title                    = {{FAOSTAT: Food balance sheet}},
  Author                   = {FAO},
  Year                     = {2011},
  Address                  = {Rome},
  Url                      = {http://faostat3.fao.org/download/FB/FBS/E},
  Urldate                  = {15.1.2014}
}

然后,当我使用 BibTex 编译它时,我收到以下警告

Package biblatex Warning: Biber reported the following issues
(biblatex) with 'FAO.2011':
(biblatex) - Datamodel: Entry 'FAO.2011' (literature.bib): Inval
id format '15.1.2014' of date field 'urldate' - ignoring.

有什么方法可以改变 Bibtex 的格式,使其读取urldate格式urldate = {dd.mm.yyyy},或者我可以以某种方式将其转换为urldate = {yyyy-mm-dd}

我在网上搜索过,没有找到任何解决方案。这似乎是 Citavi 的一个特定问题。可惜 Citavi 无法自定义。

我的问题与此类似:忽略参考书目字段[例如“urldate”]以消除 biblatex/biber 警告。但是,本主题中没有提供针对我的问题的解决方案,因为在这种情况下urldate不需要,因此只是忽略了。但我需要给出urldate

答案1

感谢 Giacomo 的反馈,我找到了针对此特定问题的另一种解决方案:

这个问题在某种程度上与 Citavi 更相关,而 Citavi 不像 LaTeX 那样清晰或透明。供将来遇到类似问题的人参考:尽管 Citavi 要求以urldate={dd.mm.yyyy}您可以输入的格式提供日期urldate = {yyyy-mm-dd}。导出没有任何问题。奇怪的是,只需更改一个条目,所有其他条目都会相应地导出。我的错,没有早点尝试。我应该早点试试。

答案2

如果你正在使用biblatex包,你可以使用

\DeclareSourcemap{
    \maps{
        \map[overwrite]{
            \step[fieldsource=urldate,
            match=\regexp{([0-9]{2})\.([0-9]{2})\.([0-9]{4})},
            replace={$3-$2-$1},
            final]
        }
    }
}

在您的序言中重新格式化urldate输入文件的字段*.bib

答案3

为了强制 BibTeX 格式,我使用双括号,例如:

Urldate  = {{15/01/2014}}

答案4

我编写了一个可以更改 urldate 格式的小 Python 脚本:将您的 .bib 文件放在与此脚本相同的目录中,并将其命名为“quellen.bib”,然后运行该脚本。将出现一个名为“changedFile.bib”的新格式文件

import re

file = open("quellen.bib","r");
fileChanged = open("changedFile.bib","w");
pattern = re.compile("([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})");

for line in file:
    if "urldate =" in line and pattern.search(line):
        #save end of line to add it later to the modified date
        endline = line[line.index('}')+1:len(line)];
        date = line[line.index('{')+1:line.index('}')];
        month = int(date[0:date.index('/')]);
        date = date[date.index('/')+1:len(date)];
        day = int(date[0:date.index('/')]);
        date = date[date.index('/')+1:len(date)];
        year = int(date);
        if month > 12:
            # check if month and day are reversed
            temp = day;
            day = month;
            month = temp;
        # check if every value is ledgit
        if(month > 0 and month < 13 and day >0 and day < 32 and year > 1000):
            if(month<10):
                #add 0 if month or day is less then 10
                month = "0"+str(month);
            if(day<10):
                day = "0"+str(day);    
            fileChanged.write(" urldate = {"+ str(year)+"-"+str(month)+"-"+str(day)+"}"+endline);
        else:
            print("something is wrong with this line: ");
            print("day: ",day,"montH: ",month, "year: ",year);
            print(line);
    else:
        fileChanged.write(line);
file.close;
fileChanged.close;

    

相关内容