Вопрос или проблема
У меня есть много скриптов bash, которые преобразуют различные источники данных в CSV.
Скрипты часто содержат ошибки, поэтому я хотел бы добавить шаг проверки.
Существует ли инструмент для проверки CSV-файлов?
Требования:
- Бесплатный,
- Командная строка,
- Доступен на Linux,
- Работает офлайн,
- Инструмент должен как минимум убедиться, что CSV соблюдает правила, которые позволят его загрузку в Excel и Calc.
Допустимо, если инструмент требует, например, ;
вместо ,
, я могу адаптироваться. Все мои значения заключены в кавычки.
Вы можете использовать CLI frictionless и, в частности, команду validate:
frictionless validate input.csv
и вы получите обратно просто
# -----
# valid: input.csv
# -----
Это очень полезно для массового анализа, чтобы получать вывод проверки в формате JSON. Вот пример.
Не обязательно определять правила проверки, он выполняет набор классических тестов для этого формата файла.
Но вы также можете определить набор правил, чтобы проверить CSV в нужном вам виде.
Не совсем понятно, насколько далеко простираются ваши требования, но в целом большинство языков сценариев имеют собственный CSV-парсер и могут использоваться из командной строки. Если в вашем CSV-файле есть ошибка, парсер должен ее обнаружить.
Например:
echo "one, two" | ruby -r csv -e 'CSV.parse(STDIN.read)'
результат выполнения скрипта не даст выхода и код завершения будет 0
В то время как:
echo 'one, "two' | ruby -r csv -e 'CSV.parse(STDIN.read)'
Выдает код завершения 1
и вывод:
/usr/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift': Illegal quoting in line 1. (CSV::MalformedCSVError)
from /usr/lib/ruby/1.9.1/csv.rb:1887:in `each'
from /usr/lib/ruby/1.9.1/csv.rb:1887:in `block in shift'
from /usr/lib/ruby/1.9.1/csv.rb:1849:in `loop'
from /usr/lib/ruby/1.9.1/csv.rb:1849:in `shift'
from /usr/lib/ruby/1.9.1/csv.rb:1791:in `each'
from /usr/lib/ruby/1.9.1/csv.rb:1805:in `to_a'
from /usr/lib/ruby/1.9.1/csv.rb:1805:in `read'
from /usr/lib/ruby/1.9.1/csv.rb:1379:in `parse'
from -e:1:in `<main>'
Я не знаю, соответствуют ли его требования требованиям Excel.
Обратите внимание на csvkit, библиотеку на языке Python для работы с CSV-данными с сопутствующими скриптами командной строки. Она разработана для умного обращения с кодировкой символов (и может использоваться для преобразования или нормализации ваших кодировок), и поскольку она использует модуль csv
языка Python, она довольно надежна с точки зрения чтения и записи в соответствии со спецификацией.
Она разработана с учетом принципов UNIX, поэтому хорошо подходит для пайпов и подобных сценариев. Простой тест можно провести, запустив ваши данные через csvcut -n [filename] | wc -l
и проверив, имеет ли она ожидаемое количество столбцов.
Инструмент csvstat
попытается вывести тип данных для каждого столбца, что может быть полезно для проверки. Разбор его вывода менее прост, хотя как человек, иногда участвующий в разработке библиотеки, я бы рискнул предложить, что запрос на добавление нового аргумента командной строки для получения другого типа вывода от csvstat
, который проще парсить, был бы рассмотрен. (Возможно, это имеет смысл как другая команда — это не то, о чем я много думал.)
Вы можете использовать сам bash для написания хорошего валидатора для CSV-файла.
Вы можете обратиться к этому предыдущему посту. Там объясняется, как использовать команду “awk” для реализации валидатора для полей и для самого файла.
Ответ или решение
Конечно, для выполнения валидации CSV-файлов на командной строке в среде Linux, учитывая указанные вами требования, существует несколько подходящих решений. Вкратце рассмотрим основные возможности, которые, вероятно, удовлетворят ваши потребности.
Frictionless
Frictionless — это утилита, которая предоставляет возможность валидации CSV-файлов. Она является бесплатной, работает на командной строке Linux и функционирует в оффлайн-режиме. Frictionless CLI проводит стандартные тесты для проверки совместимости CSV-файлов с Excel и LibreOffice Calc. Для начала работы установите Frictionless с помощью pip:
pip install frictionless
Затем для валидации файла выполните команду:
frictionless validate input.csv
Эта команда проверит файл на наличие ошибок, выведет информацию о его валидности и, при необходимости, предоставит подробности о найденных проблемах.
CSVKit
CSVKit — это набор командных утилит на Python для работы с CSV-данными, включая их проверку. Этот инструмент также удовлетворяет требованиям и может быть использован для выполнения сложных операций над CSV-файлами, включая валидацию структуры и типов данных столбцов.
Установить CSVKit можно с помощью следующей команды:
pip install csvkit
Для проверки файла используйте команду csvlint
, которая проверяет его формат:
csvlint input.csv
CSVKit интегрируется в UNIX-системы и поддается модификации, что делает его гибким инструментом для различных сценариев использования.
Использование Ruby
Если у вас есть опыт работы с Ruby, можно использовать встроенный модуль CSV для проверки корректности CSV-файлов. Команда выглядит следующим образом:
echo 'one, "two' | ruby -r csv -e 'CSV.parse(STDIN.read)'
Ruby-сценарии обрабатывают стандартный ввод и позволяют анализировать целостность CSV-файлов, выявляя ошибки баш-скриптов и сохраняя корректность данных.
Bash и AWK
Для тех, кто предпочитает использовать Bash-скрипты, AWK может стать основой для собственного валидатора CSV-файлов. Это подход требует больше программирования, но также может быть настроен для проверки определенных условий ваших данных. Пример того, как это можно реализовать, можно найти в этом посте на Stack Overflow.
Заключение
Все эти инструменты предоставляют мощные средства для проверки и анализа ваших CSV-файлов. Выбор подходящего инструмента зависит от глубины ваших проверок, уровня сложности и интеграции в существующие рабочие процессы. Убедитесь, что выбранный инструмент соответствует вашим специфическим нуждам и требованиям к данному проекту.