11.2 Další textové formáty
Balík readr umožňuje číst data i z dalších typů textových formátů. Nejjednodušším případem jsou tabulární formáty, které nejsou delimitované, tj. jednotlivé sloupce nejsou oddělené jasně definovaným znakem. Sem patří zejména dva typy formátů. V prvním jsou jednotlivé sloupce oddělené mezerami (nebo jinými “bílými znaky,” např. tabelátory). V ideálním případě jsou mají všechny sloupce díky bílým znakům právě stejnou šířku. K načtení těchto formátů slouží funkce read_table()
. Druhou možností jsou formáty s pevnou šířkou sloupců. K jejich načtení můžete použít funkci read_fwf()
. Všechny tyto funkce mají syntaxi velmi podobnou funkcím na čtení delimitovaných formátů.
Soubor “bmi_data.txt” obsahuje stejná data jako výše, ovšem tentokrát jsou oddělená jen bílými místy, v našem případě mezerami:
id height weight bmi
1 153 55 23.4952368747
2 207 97 22.6376344839
3 173 83 27.7322997761
4 181 92 28.0821708739
5 164 112 41.6418798334
Použít funkce read_delim()
a její speciální varianty není možné, protože nemáme jasný oddělující znak (dokonce ani mezera by nefungovala, vyzkoušejte si to a vysvětlete, proč). Naštěstí pro nás je možné tato data snadno načíst pomocí funkce read_table()
:
read_table("data/reading_and_writing/bmi_data.txt",
col_types = "iiid")
## # A tibble: 5 × 4
## id height weight bmi
## <int> <int> <int> <dbl>
## 1 1 153 55 23.5
## 2 2 207 97 22.6
## 3 3 173 83 27.7
## 4 4 181 92 28.1
## 5 5 164 112 41.6
Naše tabulka má všechny sloupce stejně široké, můžeme tedy použít i funkci read_fwf()
. V tomto případě je však třeba specifikovat hranice jednotlivých sloupců. K tomu slouží pomocné funkce fwf_empty()
, fwf_widths
, fwf_positions()
a fwf_cols()
. Nejjednodušší z nich je funkce fwf_widths()
, do které se zadává šířka jednotlivých sloupců. Formát FWF také nepodporuje jména sloupců, takže musíme přeskočit první řádek, který jména obsahuje, a jména sloupců zadat ručně ve funkci fwf_widths()
:
read_fwf("data/reading_and_writing/bmi_data.txt",
fwf_widths(c(2, 7, 7, 13), c("id", "výška", "váha", "bmi")),
col_types = "iiid",
skip = 1)
## # A tibble: 5 × 4
## id výška váha bmi
## <int> <int> <int> <dbl>
## 1 1 153 55 23.5
## 2 2 207 97 22.6
## 3 3 173 83 27.7
## 4 4 181 92 28.1
## 5 5 164 112 41.6
Na další detaily se podívejte do dokumentace. Balík readr neobsahuje žádné funkce pro výpis do těchto formátů.
V pripade, ze textova data nejsou formatovana ani jednim z vyse popsanych formatu, je mozne nacist textovy soubor jako retezec a data si zpracovat sami pomoci funkci, ktere se naucite v kapitole 13. K načtení textového souboru po jednotlivých řádcích slouží funkce read_lines()
a read_lines_raw()
, které načtou jednotlivé řádky ze souboru a uloží je do vektoru řetězců, kde každý prvek odpovídá jednomu řádku. Obě funkce umožní zadat, kolik řádků načíst (parametr n_max
) a kolik počátečních řádků přeskočit (parametr skip
). Funkce read_lines()
umožňuje zadat i kódování textu pomocí locale
způsobem popsaným výše.
Náš testovací datový soubor bychom načetli takto:
read_lines("data/reading_and_writing/bmi_data.csv")
## [1] "id,height,weight,bmi" "1,153,55,23.4952368747"
## [3] "2,207,97,22.6376344839" "3,173,83,27.7322997761"
## [5] "4,181,92,28.0821708739" "5,164,112,41.6418798334"
Funkce write_lines()
umožňuje uložit vektor řetězců do souboru. Na detaily se podívejte do dokumentace.
Pokud není způsob, jakým jsou v textovém souboru data rozdělena do řádků, užitečný, je možné načíst celý soubor do jednoho řetězce. K tomu slouží funkce read_file()
a read_file_raw()
. Funkce write_file()
zapíše řetězec do souboru. Detaily použití opět najdete v dokumentaci.