2012-07-28 9 views
6

Mam wektor znaków, który jest plikiem skrobania PDF za pomocą pdftotext (narzędzie wiersza poleceń).Gdzie ukrywa się ta biała spacja?

Wszystko jest (błogo) ładnie wyrównane. Jednak wektor jest usiane rodzaju białych znaków, które wymyka moich regularnych wyrażeń:

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

Oczywiście istnieje jakiś znak, który nie jest uzyskiwanie przypisane w dput, jak w poniższym pytaniu:

How to properly dput internationalized text?

Nie mogę skopiować/wkleić całego wektora .... W jaki sposób mogę wyszukać i zniszczyć białe spacje?

Edit

Oczywiście nie byłem nawet blisko, aby wyczyścić, ponieważ odpowiedzi są wszędzie. Tutaj jest jeszcze prostszy przypadek testowy:

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

Istnieje jedna przestrzeń między słowem „Klinika” i „Informacji” wydrukowane na ekranie i na wyjściu dput, ale to, co jest w ciągu nie jest standardową przestrzeń . Moim celem jest wyeliminowanie tego, dzięki czemu mogę poprawnie odsunąć ten element.

+0

To spacje nie jest w samym wektorem, to tylko w sposób, w jaki są wyświetlane. –

+0

Spójrz na 'lapply (test [4], utf8ToInt)' i sprawdź, czy są tam duże liczby. –

+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' –

Odpowiedz

5

Rozbudowa mój komentarz do odpowiedzi:

ciąg zawiera non-breaking space (U + 00A0), który został przetłumaczony na normalnej przestrzeni, kiedy go wklejać. Dopasowując wszystkie dziwne znaki spacji, jak w Unicode jest łatwy w perl stylu wyrażeń regularnych:

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

Składnia Perl regexp jest \p{categoryName}, dodatkowy backslash jest częścią składni ciągiem zawierającym odwrotny ukośnik, a "Zs" to podkategoria "Separator" kategorii "kosmicznej". Prostsza metoda tylko dla znaku U + 00A0 byłoby

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

Jestem zdezorientowany. test [2] i tak nie pasowałby, nie ma w nim cyfr, które pasowałyby do części [0-9]. –

+0

Masz oczywiście rację. Powinienem przeczytać wyrażenie regularne przed uruchomieniem go na ślepo. Działa doskonale, gdy dostaję obraźliwe cyfry, dzięki! –

1

Wydaje mi się, że ścigasz i prowadzisz białą przestrzeń. Jeśli tak, być może ta funkcja będzie działać:

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

Należy także oko na kartach i takie tam, a to może być przydatne:

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

więc używać czyste i następnie Trim jak w:

Trim(clean(test)) 

również na zwrócić uwagę na en myślnik (-) i pauzy (-)

+0

Nie jestem pewien, czy rozumiem problem poprawnie. –

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

Nie widzę nic niezwykłego w białych znakach, ale myślniki w numerach telefonów to U+2010 (HYPHEN), a nie myślnik ASCII (U+002D).

Powiązane problemy