2012-07-28 19 views
6

Ho un vettore di caratteri che è il file di alcuni scraping PDF tramite pdftotext (strumento della riga di comando).Dove si nasconde questo spazio bianco?

Tutto è (beatamente) ben allineato. Tuttavia, il vettore è pieno di un tipo di spazio bianco che elude le mie espressioni regolari:

> test 
[1] "Address:"    "Clinic Information:" "Store "    "351 South Washburn" "Aurora Quick Care"  
[6] "Info"     "St. Oshkosh, WI 54904" "Phone: 920‐232‐0718" "Pewaukee" 

> grepl("[0-9]+ [A-Za-z ]+",test) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

> dput(test) 
c("Address:", "Clinic Information:", "Store ", "351 South Washburn", 
"Aurora Quick Care", "Info", "St. Oshkosh, WI 54904", "Phone: 920‐232‐0718", 
"Pewaukee") 

> test.pasted <- c("Address:", "Clinic Information:", "Store ", "351 South Washburn", 
+     "Aurora Quick Care", "Info", "St. Oshkosh, WI 54904", "Phone: 920‐232‐0718", 
+     "Pewaukee") 

> grepl("[0-9]+ [A-Za-z ]+",test.pasted) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 

> Encoding(test) 
[1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" 

> Encoding(test.pasted) 
[1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "UTF-8" "unknown" 

Chiaramente c'è qualche personaggio che non è sempre assegnato nella dput, come nella domanda di seguito:

How to properly dput internationalized text?

Non riesco a copiare/incollare l'intero vettore .... Come faccio a cercare e distruggere questo spazio bianco non di spazio bianco?

Modifica

Chiaramente non ero nemmeno vicino a chiarire perché le risposte sono in tutto il luogo. Ecco un banco di prova ancora più semplice:

> grepl("Clinic Information:", test[2]) 
[1] FALSE 
> grepl("Clinic Information:", "Clinic Information:") # Where the second phrase is copy/pasted from the screen 
[1] TRUE 

C'è un unico spazio tra il termine "clinica" e "Informazioni" stampata sullo schermo e nella dput uscita, ma tutto ciò che è nella stringa non è uno spazio di serie . Il mio obiettivo è quello di eliminare questo, in modo da poter annullare in modo corretto quell'elemento.

+0

Quello spazio non è nel vettore stesso, è solo nel modo in cui viene visualizzato. –

+0

Dai un'occhiata a 'lapply (test [4], utf8ToInt)' e vedi se ci sono grossi numeri lì dentro. –

+0

@AlanCurry '> lapply (test [4], utf8ToInt) [1] 51 53 49 160 83 111 117 116 104 160 87 97 115 104 98 117 114 110' –

risposta

5

Aggiornamento mio commento ad una risposta:

La stringa contiene uno spazio non-breaking (U + 00A0) che ha ottenuto tradotto in uno spazio normale quando è stato incollato. Corrispondenza tutti gli strani caratteri spazio-come in Unicode è facile con un perl-style espressione regolare:

grepl("[0-9]+\\p{Zs}[A-Za-z ]+", test, perl=TRUE) 

La sintassi di Perl regexp è \p{categoryName}, il backslash extra è parte della sintassi di una stringa contenente un backslash, e "Zs" è la categoria Unicode "Separator", la sottocategoria "space". Un metodo più semplice per il solo carattere U + 00A0 sarebbe

grepl("[0-9]+[ \\xa0][A-Za-z ]+", test) 
+0

Sono confuso. test [2] non corrisponde comunque, non ha cifre in esso per abbinare la parte [0-9]. –

+0

Ovviamente hai ragione. Avrei dovuto leggere la regex prima di eseguirla alla cieca. Funziona perfettamente una volta che ho ottenuto le cifre offensive, grazie! –

1

Penso che tu stia seguendo e conducendo lo spazio bianco. Se così forse questa funzione è operativa:

Trim <- function (x) gsub("^\\s+|\\s+$", "", x) 

Anche tenere d'occhio per le schede e tale e questo può essere utile:

clean <- function(text) { 
    gsub("\\s+", " ", gsub("\r|\n|\t", " ", text)) 
} 

in modo da utilizzare il pulito e poi il Trim come in:

Trim(clean(test)) 

anche essere sullo sguardo fuori per il trattino (-) e il trattino lungo (-)

+0

Non sono sicuro di aver compreso correttamente il problema. –

0
test <- c("Address:", "Clinic Information:", "Store ", "351 South Washburn", 
"Aurora Quick Care", "Info", "St. Oshkosh, WI 54904", "Phone: 920‐232‐0718", 
"Pewaukee") 

> grepl("[0-9]+ [A-Za-z ]+",test) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 


library(stringr) 
test2 <- str_trim(test, side = "both") 

> grepl("[0-9]+ [A-Za-z ]+",test2) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
# So there were no spaces in the vector, just the screen output in this case. 
1

Non vedo nulla di insolito negli spazi bianchi, ma i trattini nei numeri di telefono sono U+2010 (HYPHEN), non il trattino ASCII (U+002D).

Problemi correlati