I was delighted to read about openxlsx package that strips the dependency on Java. Package has all the C++ goodness necessary to read xlsx files.
I gave it a whirl on a public data base of National Health Inspection published on blog htt://podcrto.si (number 2).
require(openxlsx)
## Loading required package: openxlsx
## Warning: package 'openxlsx' was built under R version 3.1.0
zdin <- read.xlsx("./data/Zdravstvena-inspekcija-original.xlsx", sheet = 1)
However some local characters like ščćž (perhaps even German/Austrian üäß?) are not working. I tried changing encoding
str(zdin)
## 'data.frame': 975 obs. of 8 variables:
## $ Kršitelj : chr "Suzana Pelič (Suzana Pelič s.p.)" "KORADIN - LABA d.o.o." "KULTURNO UMETNIŠKO DRUŠTVO MREŽA" "KOLT d.o.o." ...
## $ Matična.številka : chr "3481956000" "1775600000" "5506301000" "3663515000" ...
## $ Ĺ.tevilka.zadeveÂ.> : chr "061 - 1101 / 2010" "06101 - 7628 / 2010" "06176 - 2190 / 2010" "7101 - 117 / 2011" ...
## $ Datum.izdaje : int 40842 40504 40648 40630 40798 40637 40638 40883 40708 40668 ...
## $ Datum.prekrška : int 40630 40500 40528 40544 40606 40632 40498 40551 40582 40654 ...
## $ Kraj.in.naslov.prekrška: chr "Okrepčevalnica Minutka Adamičeva 62" "VB8 - KOZINA Istrska cesta 36 " "MENZA PRI KORITU Masarykova 24, Ljubljana" "Gostilna Rot Bohinjska Bela 34" ...
## $ Členi.kršitev : chr "2. odstavek 19. člena v zvezi z 10. točko 1. odstavka 19. člena člena Uredbe o izvajanju delov določenih uredb Skupnosti g"| __truncated__ "19. točka 1. odstavka 21. člena Zakona o omejevanju uporabe tobačnih izdelkov (Uradni list RS, št. 93/2007, uradno prečiš"| __truncated__ "19. točka 1. odstavka 21. člena Zakona o omejevanju uporabe tobačnih izdelkov (Uradni list RS, št. 93/2007, uradno prečiš"| __truncated__ "5. alineja 1. odstavka 38. člena Zakona o inšpekcijskem nadzoru (Uradni list RS, št. 43/2007, uradno prečiščeno besedilo "| __truncated__ ...
## $ Znesek.globe : int 800 2000 2000 0 2000 0 2000 800 800 0 ...
options(encoding = "UTF-8")
zdin <- read.xlsx("./data/Zdravstvena-inspekcija-original.xlsx", sheet = 1)
str(zdin)
## 'data.frame': 975 obs. of 8 variables:
## $ Kršitelj : chr "Suzana Pelič (Suzana Pelič s.p.)" "KORADIN - LABA d.o.o." "KULTURNO UMETNIŠKO DRUŠTVO MREŽA" "KOLT d.o.o." ...
## $ Matična.številka : chr "3481956000" "1775600000" "5506301000" "3663515000" ...
## $ Ĺ.tevilka.zadeveÂ.> : chr "061 - 1101 / 2010" "06101 - 7628 / 2010" "06176 - 2190 / 2010" "7101 - 117 / 2011" ...
## $ Datum.izdaje : int 40842 40504 40648 40630 40798 40637 40638 40883 40708 40668 ...
## $ Datum.prekrška : int 40630 40500 40528 40544 40606 40632 40498 40551 40582 40654 ...
## $ Kraj.in.naslov.prekrška: chr "Okrepčevalnica Minutka Adamičeva 62" "VB8 - KOZINA Istrska cesta 36 " "MENZA PRI KORITU Masarykova 24, Ljubljana" "Gostilna Rot Bohinjska Bela 34" ...
## $ Členi.kršitev : chr "2. odstavek 19. člena v zvezi z 10. točko 1. odstavka 19. člena člena Uredbe o izvajanju delov določenih uredb Skupnosti g"| __truncated__ "19. točka 1. odstavka 21. člena Zakona o omejevanju uporabe tobačnih izdelkov (Uradni list RS, št. 93/2007, uradno prečiš"| __truncated__ "19. točka 1. odstavka 21. člena Zakona o omejevanju uporabe tobačnih izdelkov (Uradni list RS, št. 93/2007, uradno prečiš"| __truncated__ "5. alineja 1. odstavka 38. člena Zakona o inšpekcijskem nadzoru (Uradni list RS, št. 43/2007, uradno prečiščeno besedilo "| __truncated__ ...
## $ Znesek.globe : int 800 2000 2000 0 2000 0 2000 800 800 0 ...
options(encoding = "native.enc")
Rats, it didn't work. After promptly giving up, I emailed author of the package and his quick response was a hack that works. It involves coercing everything with Encoding in UTF-8.
for (i in 1:ncol(zdin)) {
if (class(zdin[, i]) == "character")
Encoding(zdin[, i]) <- "UTF-8"
}
Encoding(names(zdin)) <- "UTF-8"
str(zdin)
## 'data.frame': 975 obs. of 8 variables:
## $ Kršitelj : chr "Suzana Pelič (Suzana Pelič s.p.)" "KORADIN - LABA d.o.o." "KULTURNO UMETNIŠKO DRUŠTVO MREŽA" "KOLT d.o.o." ...
## $ Matična.številka : chr "3481956000" "1775600000" "5506301000" "3663515000" ...
## $ <c5>.tevilka.zadeve<c2>.>: chr "061 - 1101 / 2010" "06101 - 7628 / 2010" "06176 - 2190 / 2010" "7101 - 117 / 2011" ...
## $ Datum.izdaje : int 40842 40504 40648 40630 40798 40637 40638 40883 40708 40668 ...
## $ Datum.prekrška : int 40630 40500 40528 40544 40606 40632 40498 40551 40582 40654 ...
## $ Kraj.in.naslov.prekrška : chr "Okrepčevalnica Minutka Adamičeva 62" "VB8 - KOZINA Istrska cesta 36 " "MENZA PRI KORITU Masarykova 24, Ljubljana" "Gostilna Rot Bohinjska Bela 34" ...
## $ Členi.kršitev : chr "2. odstavek 19. člena v zvezi z 10. točko 1. odstavka 19. člena člena Uredbe o izvajanju delov določenih uredb Skupnosti glede "| __truncated__ "19. točka 1. odstavka 21. člena Zakona o omejevanju uporabe tobačnih izdelkov (Uradni list RS, št. 93/2007, uradno prečiščeno b"| __truncated__ "19. točka 1. odstavka 21. člena Zakona o omejevanju uporabe tobačnih izdelkov (Uradni list RS, št. 93/2007, uradno prečiščeno b"| __truncated__ "5. alineja 1. odstavka 38. člena Zakona o inšpekcijskem nadzoru (Uradni list RS, št. 43/2007, uradno prečiščeno besedilo ZIN-UP"| __truncated__ ...
## $ Znesek.globe : int 800 2000 2000 0 2000 0 2000 800 800 0 ...
It's not perfect, still having problems with some capitals, but it's not bad. We can probably expect this to trickle down to source code soon.