R Academy · Lekcja

Parsowanie plików TSV i plików o stałej szerokości

Używaj read_tsv() i read_fwf() do pracy z danymi rozdzielanymi tabulatorami i danymi o stałej szerokości.

Lekcja 2 z 413 kroki

Parsowanie plików TSV i plików o stałej szerokości to bezpłatna lekcja R Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

Poza CSV: inne formaty plików

Nie wszystkie dane tabelaryczne są zapisane w formacie CSV. Pliki rozdzielane tabulatorami (TSV), pliki z separatorem pionową kreską oraz pliki o stałej szerokości (FWF) są często używane w danych rządowych, starszych systemach i naukowych bazach danych. Pakiet readr obsługuje wszystkie te formaty za pomocą spójnej składni.

library(readr)

# readr's flat file readers:
# read_csv()    - comma-separated
# read_csv2()   - semicolon-separated (European)
# read_tsv()    - tab-separated
# read_delim()  - any delimiter
# read_fwf()    - fixed-width format
# read_lines()  - raw text, one line per element

cat('All readr functions return tibbles with the same interface!')

read_tsv() — wartości rozdzielane tabulatorami

read_tsv() odczytuje pliki rozdzielane tabulatorami. Przyjmuje te same argumenty co read_csv() — col_types, na, skip itd. TSV jest preferowany zamiast CSV, gdy dane zawierają przecinki (np. adresy lub opisy).

library(readr)

# Simulated TSV using \t as delimiter
tsv_data <- 'name\tscore\tcity
Alice Smith\t85\tNew York, NY
Bob Jones\t92\tLos Angeles, CA
Carol White\t78\tChicago, IL'

# Note: cities contain commas — TSV handles this cleanly
df <- read_tsv(tsv_data, show_col_types=FALSE)
print(df)

read_delim() — dowolny separator

read_delim(file, delim='|') obsługuje dowolny jedn znakowy separator. Pliki rozdzielane pionową kreską (|) są często używane w hurtowniach danych i eksportach rządowych, ponieważ pionowe kreski rzadko występują w samych danych.

library(readr)

# Pipe-delimited data
pipe_data <- 'ID|Name|Department|Salary
1|Alice Smith|Engineering|95000
2|Bob Jones|Marketing|72000
3|Carol White|HR|65000'

df <- read_delim(pipe_data, delim='|', show_col_types=FALSE)
print(df)

read_delim() dla plików z separatorem średnikowym

Europejskie pliki CSV często używają średników jako separatorów i przecinków jako znaków dziesiętnych. read_csv2() jest skrótem dla read_delim(delim=';', locale=locale(decimal_mark=',')), ale można też bezpośrednio skonfigurować read_delim().

library(readr)

# European-style: semicolon delimiter, comma decimal
european_data <- 'name;price;quantity
Widget;9,99;100
Gadget;24,50;50
Sprocket;4,75;200'

# Method 1: read_csv2() shortcut
df1 <- read_csv2(european_data, show_col_types=FALSE)
print(df1)

# Method 2: explicit read_delim
# read_delim(data, delim=';', locale=locale(decimal_mark=','))

read_fwf() — format o stałej szerokości

Pliki o stałej szerokości nie mają separatorów — kolumny są identyfikowane na podstawie ich pozycji znaków. Są często używane w eksportach ze starszych systemów mainframe i w danych rządowych. Użyj fwf_widths(), aby określić szerokości kolumn, lub fwf_cols(), aby określić pozycje początkowe i końcowe.

library(readr)

# Fixed-width data (positions matter!)
fwf_data <- 'Alice    085NYC      
Bob      092LA       
Carol    078Chicago  '

# Column widths: name=9, score=3, city=10
df <- read_fwf(
  fwf_data,
  col_positions = fwf_widths(
    widths = c(9, 3, 10),
    col_names = c('name','score','city')
  ),
  show_col_types = FALSE
)

print(df)

fwf_positions() dla kolumn początkowych i końcowych

fwf_positions(start, end, col_names) określa dokładne początkowe i końcowe pozycje znaków (indeksowane od 1). Jest to precyzyjne rozwiązanie, gdy szerokości kolumn są różne lub gdy trzeba pominąć niektóre kolumny, nie określając ich.

library(readr)

# Another fixed-width example using start/end positions
fwf_data <- '001ALICE   02024-01-15
002BOB     01   2024-02-20
003CAROL   03   2024-03-10'

df <- read_fwf(
  fwf_data,
  col_positions = fwf_positions(
    start = c(1, 4, 11, 14),
    end   = c(3, 10, 12, 23),
    col_names = c('id','name','score','date')
  ),
  show_col_types = FALSE
)

print(df)

fwf_empty() — automatyczne wykrywanie szerokości

fwf_empty(file, col_names) próbuje automatycznie wykryć granice kolumn na podstawie odstępów między grupami białych znaków. Nazwy kolumn należy przekazać osobno. Funkcja działa najlepiej w przypadku poprawnie sformatowanych plików FWF ze stałymi odstępami.

library(readr)

# Well-spaced fixed-width data
fwf_data <- 'name     score  grade
Alice    85     B
Bob      92     A
Carol    78     C
Dave     88     B'

# Auto-detect column positions from whitespace
df <- read_fwf(
  fwf_data,
  col_positions = fwf_empty(fwf_data, col_names=c('name','score','grade')),
  show_col_types = FALSE
)

print(df)

read_lines() — parsowanie surowego tekstu

read_lines(file) odczytuje plik tekstowy wiersz po wierszu i zwraca wektor znaków. Jest to funkcja odczytu najniższego poziomu — użyj jej, gdy przed parsowaniem trzeba wstępnie przetworzyć wiersze (np. odfiltrować komentarze lub obsłużyć niespójne formaty).

library(readr)

# Read lines and filter manually
raw_text <- '# Comment line
# Another comment
name,score
Alice,85
Bob,92'

lines <- read_lines(raw_text)
print(lines)

# Filter out comment lines
clean_lines <- lines[!startsWith(lines, '#')]
df <- read_csv(paste(clean_lines, collapse='\n'), show_col_types=FALSE)
print(df)

read_lines() do przyrostowego sprawdzania

read_lines(file, n_max=10) wyświetla podgląd tylko kilku pierwszych wierszy dowolnego pliku tekstowego przed wykonaniem pełnego odczytu. Jest to przydatne do diagnozowania problemów z kodowaniem, znajdowania właściwego wiersza nagłówka lub wykrywania rodzaju separatora.

library(readr)

# Preview first few lines before reading
sample_file <- 'METADATA: version 1.2
DATE: 2024-01-15
---
id,name,value
1,Alice,100
2,Bob,200'

# Inspect to find where the data starts
preview <- read_lines(sample_file, n_max=4)
print(preview)
# From this we know: skip=3, then read as CSV

Obsługa problemów z kodowaniem

Znaki spoza ASCII (akcenty i pismo inne niż łacińskie) wymagają określenia właściwego kodowania. Użyj locale(encoding='latin1') lub locale(encoding='UTF-8') wewnątrz read_csv() albo read_delim(). Domyślnie używane jest UTF-8.

library(readr)

# Detect encoding of a file
# readr::guess_encoding('file.csv')  # Returns likely encodings

# Specify encoding explicitly
# df <- read_csv('data_latin1.csv',
#   locale = locale(encoding = 'latin1'))

# For UTF-8 with BOM (common in Windows exports):
# df <- read_csv('data_utf8bom.csv',
#   locale = locale(encoding = 'UTF-8-BOM'))

cat('Encoding matters for accented chars: \xc3\xa9 (UTF-8 for e-acute)\n')
print(guess_encoding(chartr('\xe9','e','caf\xe9')))

Wybór właściwej funkcji odczytu

Krótki przewodnik po wyborze właściwej funkcji readr:

  • Przecinki → read_csv()
  • Średniki i europejskie znaki dziesiętne → read_csv2()
  • Tabulatory → read_tsv()
  • Inne separatory → read_delim(delim='|')
  • Stałe pozycje → read_fwf()
  • Surowy podgląd → read_lines()
library(readr)

# Quick comparison of delimiters
csv_data  <- 'a,b,c\n1,2,3'
tsv_data  <- 'a\tb\tc\n1\t2\t3'
pipe_data <- 'a|b|c\n1|2|3'

read_csv(csv_data, show_col_types=FALSE)
read_tsv(tsv_data, show_col_types=FALSE)
read_delim(pipe_data, delim='|', show_col_types=FALSE)

Szybkie sprawdzenie

Która funkcja readr jest najlepszym wyborem do odczytu pliku, w którym kolumny są określone przez stałe pozycje znaków (bez separatorów)?

Podsumowanie: pliki TSV i pliki o stałej szerokości

Najważniejsze informacje o niesformatowanych plikach innych niż CSV:

  • read_tsv() — wartości rozdzielane tabulatorami; najlepsze rozwiązanie, gdy dane zawierają przecinki
  • read_delim(delim='|') — dowolny jedn znakowy separator
  • read_csv2() — wartości rozdzielane średnikami z europejskimi znakami dziesiętnymi
  • read_fwf(fwf_widths(c(10,5,8))) — format o stałej szerokości określany szerokościami kolumn
  • read_fwf(fwf_positions(start, end)) — format o stałej szerokości określany dokładnymi pozycjami
  • read_lines(file, n_max=10) — sprawdza surowe wiersze przed parsowaniem
  • Wszystkie funkcje mają te same argumenty col_types, na, skip i locale()
library(readr)

# Pipe-delimited with custom NA values
df <- read_delim(
  'ID|Name|Score|City
  1|Alice|85|NYC
  2|Bob|N/A|N/A
  3|Carol|78|Chicago',
  delim = '|',
  na = c('', 'NA', 'N/A'),
  show_col_types = FALSE
)

print(df)
print(colSums(is.na(df)))
Bezpłatny start

Ucz się R dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
43
Lekcje
159

Często zadawane pytania

Czy lekcja „Parsowanie plików TSV i plików o stałej szerokości” jest bezpłatna?

Tak — pełny tekst „Parsowanie plików TSV i plików o stałej szerokości” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Parsowanie plików TSV i plików o stałej szerokości”?

Używaj read_tsv() i read_fwf() do pracy z danymi rozdzielanymi tabulatorami i danymi o stałej szerokości. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Parsowanie plików TSV i plików o stałej szerokości”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Odczytywanie plików CSV za pomocą read_csv()
  2. Parsowanie plików TSV i plików o stałej szerokości
  3. Importowanie plików Excela za pomocą readxl
  4. Zapisywanie danych w wielu formatach
← Powrót do R Academy