将较大的 .bib 文件拆分为每个条目一个 .bib 文件

将较大的 .bib 文件拆分为每个条目一个 .bib 文件

您好,我有一个很大的条目库,我想将其拆分,以便每个条目都有一个 .bib 文件。这似乎是将它们导入 R 的最简单且最不容易出错的方法(而不是在 R 内部完成所有这些操作)

例如:

@Article{     king2012cem,
  author    = {Iacus, Stefano M. and King, Gary and Porro, Giuseppe},
  title     = {Causal Inference without Balance Checking: {Coarsened}
          Exact Matching},
  number    = {1},
  pages     = {1-24},
  source    = {Crossref},
  timestamp = {2021-06-10},
  year      = {2012}
}

@Book{        koskinen2012ergm,
  author    = {Johan Koskinen, Dean Lusher, Garry Robins},
  title     = {Exponential Random Graph Models for Social Networks},
  subtitle  = {Theory, Methods, and Applications},
  source    = {Crossref},
  year      = {2012}
}

每个人都会得到自己的.bib 文件,最好以其 citekeys 命名,例如 king2012cem.bib 和 koskinen2012ergm.bib。

我查看了 bibtool 和 biber 的手册,但无济于事。我可能可以修复一些正则表达式来实现这一点,但我宁愿使用久经考验的工具来实现这一点。

谢谢你,

答案1

如果您使用 R,您可能希望将 .bib 文件中的数据解析为原生 R 对象,这样就无需为每个 bib 项创建文件。我创建了一个要点,在此处显示了 R 代码: https://gist.github.com/jmclawson/def66ac8635db9c6131c3f3ae092f6e5

以下是结果数据框的屏幕截图: 在此处输入图片描述

答案2

好吧,我自己找到了答案,答案如下:

使用 bibtool 和 bib2bib(来自 bibtex2html),我将其拆分,并且作为奖励是使用所有条目制作 data.frame 的 R 代码。

bibtool 中的 --‘print(xxx)’ 是 bibtool 中非常有用的格式(参见手册第 27 页),它可以以完全标准化的方式格式化 .bib,确保一切都正常。不幸的是,标准选项是在 77 个字符处用 \n 换行并使用制表符进行对齐,这对于解析为 R(长摘要、标题等)没有用。

# first make list of all entries for the loop
bib2bib -oc all-entries-list.bib  --no-comment library.bib

# then loop thru them
for xkey in $(cat all-entries-list.bib); do
  bibtool '--select{"^'$xkey'$"}' -i library.bib -o path/to/dir/"$xkey.bib" -- 'print.use.tab = {0}' -- 'print.line.length = {999999999}' 
done

这是 R 中的代码

# wd and libs
setwd('some/path/to/bibtex-entries')
library(fs)
library(data.table)
library(purrr)

# get all entries
fil1 <- dir_ls('input/singles-entries/work-bibliotek-entries/', regex='\\.bib')

clean_entries <- function(.x) {
        # .x <- fil1$path[[72]]; .x     
        # .x <- fil1[[72]]; .x      
        # .x <- fil1$path[[36]]; .x     
    # read lines and remove non-fields 
    x1 <- data.table(v1=readLines(.x)) %>% .[v1 %ilike% '@|=']
    # split into variabel name and variabel content
    # x1[,  (c('field', 'value')) := tstrsplit(v1, '^=+?')]
    x1[,  (c('field', 'value')) := tstrsplit(v1, '=(?= {)', perl=T)]
    x1[field %flike% '@', `:=` (
                field = 'entry-type',
                value = gsub('^@([A-Za-z]+).*$', '\\1',  v1))]

    # remove curlies and ending , from last line 
    x1[, value := gsub('(^[ ])\\{(.*)', '\\1\\2',  value)]
    x1[, value := gsub('(.+)\\},*$', '\\1',  value)]

    x2 <- data.table(x1$value) %>% data.table::transpose()  
    setnames(x2, x1$field)  
    x2
     # names(x2)
    # v(x2)  
}

# use safely() to run tru all of them and capture output or error without stopping 
bib1 <- map(fil1, safely(clean_entries))
map(bib1, 'error') %>% keep(~ !is.null(.x)) 

# rbind the list, with the name of the list element as column called 'citeky'
bib2 <- rbindlist( map(bib1, 'result'), idcol='citekey', fill=TRUE)
# remove path from citekey column
bib2[, citekey := gsub('^.*/(.*).bib$', '\\1', citekey)]

相关内容