2015-11-08 66 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