2015-11-08 58 views
1

我使用扫描目录中的原始文本数据。 下面是一个例子:在原始文本中粘贴字符串行

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]的[^之二]`

  • 我能够提取的艺术家的名字

".+(?=- [0-9]{4})"

(.+)[0-9]{4}.+ # with backreference \1

我希望我能粘贴ADRESS子的作品,但我的最终目标是创建一个data.frame对象,结构如下:

第1列:NAME艺术家和姓氏;
第2列:补充剂(地址,国籍......)
3列:作品或更好的... ...
专栏3:1的工作
第4列2工作等

感谢您提前你的帮助。

+0

你总是有4个字段?你能用'“ - ”'分开吗? – Mariano

+0

我仍然不确定你想要做什么。你能提供一个最小可行的数据例子和一个期望输出的例子吗? –

+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" 

希望这有助于或导致更好的想法。

+0

感谢您对我的问题的关注。感谢@Kliron的提议(这超出了我的谦虚能力)。 我用更大的样本完成了我的初步问题,我详细介绍了我的目标。 – Wilcar