# Загрузка данных из TSV и CSV

TSV/CSV — это самый простой способ передачи данных индексатору Manticore. Этот метод был создан из-за ограничений xmlpipe2. В xmlpipe2 индексатор должен сопоставить каждый тег атрибута и поля в XML-файле с соответствующим элементом схемы. Это сопоставление требует времени, и оно увеличивается с ростом количества полей и атрибутов в схеме. У TSV/CSV такой проблемы нет, так как каждое поле и атрибут соответствуют определённому столбцу в TSV/CSV файле. В некоторых случаях TSV/CSV может работать немного быстрее, чем xmlpipe2.

## Формат файла
Первый столбец в TSV/CSV-файле должен содержать ID документа. Остальные столбцы должны соответствовать объявлению полей и атрибутов в схеме. Обратите внимание, что объявлять ID документа в схеме не нужно, так как он всегда считается присутствующим и должен находиться в 1-м столбце. Для обычных таблиц ID документов должны быть явными, уникальными, ненулевыми беззнаковыми 64-битными целыми числами. Отрицательные ID документов не допускаются. Обычные таблицы не поддерживают автоматическую генерацию ID, а `0` нельзя использовать для запроса автоматически сгенерированного ID.

Разница между tsvpipe и csvpipe заключается в разделителе и правилах кавычек. В tsvpipe в качестве жёстко заданного разделителя используется символ табуляции, и нет правил кавычек. В csvpipe есть опция `csvpipe_delimiter` для разделителя со значением по умолчанию , (запятая), а также действуют правила кавычек, такие как:

* Любое поле может быть заключено в кавычки
* Поля, содержащие разрыв строки, двойные кавычки или запятые, должны заключаться в кавычки
* Символ двойной кавычки в поле должен быть представлен двумя символами двойной кавычки

## Объявление TSV потока
Директива `tsvpipe_command` является обязательной и содержит команду оболочки, вызываемую для создания TSV потока, который индексируется. Команда может читать TSV файл, но также может быть программой, которая генерирует содержимое с разделителями табуляции на лету.

##  Индексируемые столбцы TSV

Для объявления типов индексируемых столбцов можно использовать следующие директивы:

* `tsvpipe_field` — объявляет текстовое поле (`text`).
* `tsvpipe_field_string` — объявляет текстовое поле/строковый атрибут. Столбец будет как проиндексирован как текстовое поле, так и сохранён как строковый атрибут.
* `tsvpipe_attr_uint` — объявляет целочисленный атрибут.
* `tsvpipe_attr_timestamp` — объявляет атрибут временной метки.
* `tsvpipe_attr_bool` — объявляет булев атрибут.
* `tsvpipe_attr_float` — объявляет атрибут с плавающей запятой.
* `tsvpipe_attr_bigint` — объявляет атрибут с большим целым числом.
* `tsvpipe_attr_multi` — объявляет многозначный атрибут с целыми числами.
* `tsvpipe_attr_multi_64` — объявляет многозначный атрибут с 64-битными целыми числами.
* `tsvpipe_attr_string` — объявляет строковый атрибут.
* `tsvpipe_attr_json` — объявляет JSON атрибут.


Пример источника, использующего TSV файл:

```ini
source tsv_test
{
    type = tsvpipe
    tsvpipe_command = cat /tmp/rock_bands.tsv
    tsvpipe_field = name
    tsvpipe_attr_multi = genre_tags
}
```

```ini
1   Led Zeppelin    35,23,16
2   Deep Purple 35,92
3   Frank Zappa 35,23,16,92,33,24
```

## Объявление CSV потока
Директива `csvpipe_command` является обязательной и содержит команду оболочки, вызываемую для создания CSV потока, который индексируется. Команда может просто читать CSV файл, но также может быть программой, которая генерирует содержимое с разделителями-запятыми на лету.

##  Индексируемые столбцы CSV

Для объявления типов индексируемых столбцов можно использовать следующие директивы:

* `csvpipe_field` — объявляет текстовое поле (`text`).
* `csvpipe_field_string` — объявляет текстовое поле/строковый атрибут. Столбец будет как проиндексирован как текстовое поле, так и сохранён как строковый атрибут.
* `csvpipe_attr_uint` — объявляет целочисленный атрибут.
* `csvpipe_attr_timestamp` — объявляет атрибут временной метки.
* `csvpipe_attr_bool` — объявляет булев атрибут.
* `csvpipe_attr_float` — объявляет атрибут с плавающей запятой.
* `csvpipe_attr_bigint` — объявляет атрибут с большим целым числом.
* `csvpipe_attr_multi` — объявляет многозначный атрибут с целыми числами.
* `csvpipe_attr_multi_64` — объявляет многозначный атрибут с 64-битными целыми числами.
* `csvpipe_attr_string` — объявляет строковый атрибут.
* `csvpipe_attr_json` — объявляет JSON атрибут.

Пример источника, использующего CSV файл:

```ini
source csv_test
{
    type = csvpipe
    csvpipe_command = cat /tmp/rock_bands.csv
    csvpipe_field = name
    csvpipe_attr_multi = genre_tags
}
```

```ini
1,"Led Zeppelin","35,23,16"
2,"Deep Purple","35,92"
3,"Frank Zappa","35,23,16,92,33,24"
```
<!-- proofread -->

