0Pricing
R Academy · Урок

Разбор TSV-файлов и файлов фиксированной ширины

Используйте read_tsv() и read_fwf() для данных с разделителями-табуляциями и фиксированной шириной.

«Разбор TSV-файлов и файлов фиксированной ширины» — бесплатный урок R Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Помимо CSV: другие форматы файлов

Не все табличные данные представлены в формате CSV. Файлы с разделением табуляцией (TSV), файлы с разделением вертикальной чертой и файлы фиксированной ширины (FWF) часто встречаются в государственных данных, устаревших системах и научных базах данных. Пакет readr поддерживает все эти форматы с единообразным синтаксисом.

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() — значения, разделённые табуляцией

read_tsv() считывает файлы с разделением табуляцией. У него те же аргументы, что и у read_csv(): col_types, na, skip и другие. TSV предпочтительнее CSV, если данные содержат запятые (например, адреса или описания).

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() — любой разделитель

read_delim(file, delim='|') обрабатывает разделитель из одного любого символа. Файлы с разделением вертикальной чертой (|) распространены в хранилищах данных и государственных выгрузках, поскольку вертикальные черты редко встречаются в самих данных.

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() для файлов с разделением точкой с запятой

В европейских CSV-файлах в качестве разделителей часто используются точки с запятой, а в качестве десятичных разделителей — запятые. read_csv2() — это сокращённая запись для read_delim(delim=';', locale=locale(decimal_mark=',')), но можно настроить 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() — формат фиксированной ширины

В файлах фиксированной ширины нет разделителей — столбцы определяются по их позициям символов. Такой формат часто встречается в выгрузках из устаревших мейнфреймов и государственных данных. Используйте fwf_widths(), чтобы указать ширину столбцов, или fwf_cols() для задания начальных и конечных позиций.

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() для начальных и конечных позиций столбцов

fwf_positions(start, end, col_names) задаёт точные начальные и конечные позиции символов (нумерация начинается с 1). Этот способ удобен, когда ширина столбцов различается или нужно пропустить некоторые столбцы, не указывая их.

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() — автоматическое определение ширины

fwf_empty(file, col_names) пытается автоматически определить границы столбцов по промежуткам между группами пробелов. Передайте имена столбцов отдельно. Лучше всего функция работает с аккуратно отформатированными файлами FWF с равномерными интервалами.

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() — разбор необработанного текста

read_lines(file) считывает текстовый файл построчно, возвращая строковый вектор. Это функция считывания самого низкого уровня — используйте её, когда нужно предварительно обработать строки перед разбором (например, отфильтровать комментарии или обработать неоднородные форматы).

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() для поэтапного просмотра

read_lines(file, n_max=10) позволяет просмотреть только первые несколько строк любого текстового файла перед его полным считыванием. Это полезно для диагностики проблем с кодировкой, поиска фактической строки заголовков или определения типа разделителя.

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

Обработка проблем с кодировкой

Для символов, отсутствующих в ASCII (диакритические знаки, нелатинские письменности), необходимо указать правильную кодировку. Используйте locale(encoding='latin1') или locale(encoding='UTF-8') внутри read_csv() или read_delim(). По умолчанию используется 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')))

Выбор подходящей функции считывания

Краткое руководство по выбору подходящей функции readr:

  • Запятые → read_csv()
  • Точки с запятой и европейские десятичные разделители → read_csv2()
  • Табуляция → read_tsv()
  • Другие разделители → read_delim(delim='|')
  • Фиксированные позиции → read_fwf()
  • Просмотр необработанного текста → 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)

Быстрая проверка

Какая функция readr лучше всего подходит для считывания файла, в котором столбцы определяются фиксированными позициями символов (без разделителей)?

Итоги: TSV и файлы фиксированной ширины

Главное о плоских форматах файлов, отличных от CSV:

  • read_tsv() — разделение табуляцией; подходит, если данные содержат запятые
  • read_delim(delim='|') — любой разделитель из одного символа
  • read_csv2() — разделение точками с запятой и европейские десятичные разделители
  • read_fwf(fwf_widths(c(10,5,8))) — фиксированная ширина по ширине столбцов
  • read_fwf(fwf_positions(start, end)) — фиксированная ширина по точным позициям
  • read_lines(file, n_max=10) — просмотр необработанных строк перед разбором
  • Все функции используют одинаковые аргументы col_types, na, skip и 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)))

Часто задаваемые вопросы

Урок «Разбор TSV-файлов и файлов фиксированной ширины» бесплатный?

Да — полный текст урока «Разбор TSV-файлов и файлов фиксированной ширины» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Разбор TSV-файлов и файлов фиксированной ширины»?

Используйте read_tsv() и read_fwf() для данных с разделителями-табуляциями и фиксированной шириной. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Разбор TSV-файлов и файлов фиксированной ширины»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Чтение CSV-файлов с помощью read_csv()
  2. Разбор TSV-файлов и файлов фиксированной ширины
  3. Импорт Excel-файлов с помощью readxl
  4. Запись данных в разных форматах
← Назад к R Academy