我处理来自扫描目录的原始文本数据。 这是一个例子:
ABADIE-LANDEL (Pierre) — 1920 — né à Paris. — 17, rue Campagne-Première
ABOU (Albert) — 1930 — né à Marseille.
— 41, rue de Seine, 6e.
ANGER (Jacques) — 1925 — né à Paris. — 33, rue Vineuse, 16e.
ANTHONE (Armand) — 1908 — né à Paris. — 4, avenue Victor-Hugo
Rue des Tournelles
ANTRAL (Jean) — 1920
这是一个包含偶尔行的名称列表,包括地址提及。
将数据导入R:
readlines ("clipboard", encoding = " latin1 ")
[A-ZÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝYÆO][A-ZÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝYÆO |']
或(ICU)
[\p{Uppercase Letter}][\p{Uppercase Letter}|']
^ [0-9] + [\ s] [^ bis]`
".+(?=- [0-9]{4})"
或
(.+)[0-9]{4}.+ # with backreference \1
我希望我可以粘贴地址子串,但我的最终目标是创建一个data.frame对象,结构如下:
第1栏:NAME艺术家和姓氏;
第二栏:补充(地址,国籍......)
第3栏:工作或更好......
第3栏:1工作
第4栏2工作等
提前感谢您的帮助。
答案 0 :(得分:0)
如果我理解你的问题,你想从你的记录中提取名称和地址,其中一些可能跨越不同的行。
一种解决方案可能是利用角色—
作为字段分隔符的事实。因此,假设您的记录结构是常规的,您可以这样做:
(数据是保存示例字符串的变量)
## Replace newlines with the separator character
data <- gsub("\\n(\\s*—)?", " — ", data)
## Normalize space
data <- gsub("\\s+", " ", data)
## Now split by the separator character
tokens <- strsplit(data, "\\s—\\s")[[1]]
令牌现在包含:
[1] "ABADIE-LANDEL (Pierre)" "1920" "né à Paris." "17, rue Campagne-Première" "ABOU (Albert)"
[6] "1930" "né à Marseille." "41, rue de Seine, 6e." "ANGER (Jacques)" "1925"
[11] "né à Paris." "33, rue Vineuse, 16e." "ANTHONE (Armand)" "1908" "né à Paris."
[16] "4, avenue Victor-Hugo" "Rue des Tournelles" "ANTRAL (Jean)" "1920"
每个完整记录在此向量中应该有4个连续索引,但由于记录可能不完整,我们必须多做一些。
我们利用这样一个事实,即人们的名字都是大都会,并遵循严格的模式。我们在tokens
中获取名称的索引,然后在这些索引上拆分tokens
。所生成的每个子向量现在都是完整的记录:
## Get the indices of names
idx <- which(grepl("^[A-Z-]+\\s\\(", tokens))
## Use the indices to partition tokens to subvectors
records <- list()
for (i in 1:length(idx)) {
start <- idx[i]
if (i == length(idx)) {
stop <- length(tokens)
}
else {
stop <- idx[i+1] - 1
}
records[[i]] <- tokens[start:stop]
}
以下是最终的结果列表:
[[1]]
[1] "ABADIE-LANDEL (Pierre)" "1920" "né à Paris." "17, rue Campagne-Première"
[[2]]
[1] "ABOU (Albert)" "1930" "né à Marseille." "41, rue de Seine, 6e."
[[3]]
[1] "ANGER (Jacques)" "1925" "né à Paris." "33, rue Vineuse, 16e."
[[4]]
[1] "ANTHONE (Armand)" "1908" "né à Paris." "4, avenue Victor-Hugo" "Rue des Tournelles"
[[5]]
[1] "ANTRAL (Jean)" "1920"
希望这有助于或带来更好的想法。