Я ищу лучшее решение для пользовательского анализа файлов для наших процедур импорта предприятия. Я хочу в основном изменить один формат файла в стандартный формат файла и иметь одну подпрограмму, которая импортирует эти данные в базу данных. Мне нужно иметь возможность создавать собственные сценарии для каждого клиента, так как трудно заставить клиента соответствовать стандарту или шаблону. Я смотрел PowerShell и Iron Python, чтобы сделать это до сих пор, но я не уверен, что это маршрут, который я хочу. Я также рассмотрел некоторые инструменты, такие как Talend, который является инструментом стиля перетаскивания, который может или не может дать мне то, что я хочу, насколько гибкость. Мы являемся магазином .NET и создали собственный код для этого в прошлом, но мне нужно что-то, что быстрее создавать, а затем кодировать пользовательские функции синтаксического анализа каждый раз, когда мы получаем новый формат файла.Какое лучшее решение для анализа файлов для преобразования файлов?
ответ
Python замечателен для этого Такие вещи. Вот почему мы используем. Каждая новая передача клиентов - это новое приключение, и Python дает нам гибкость для быстрого реагирования.
Редактировать. Все скрипты python, которые читают файлы, являются «настраиваемыми файловыми парсерами». Без фактического примера нецелесообразно приводить подробный пример.
with open("some file", "r") as source:
for line in source:
process(line)
Это все, что касается «пользовательского парсера файлов». Если вы разбираете файлы .csv или .xml, у Python есть модули для этого. Если вы обрабатываете файлы фиксированного формата, вы должны использовать операции нарезания строк. Если вы разбираете другие файлы (X12? JSON? YAML?), Вам понадобятся соответствующие парсеры.
Tab-Delim.
from collections import namedtuple
RecordLayout = namedtuple('RecordLayout',['field1','field2','field3',...])
def process(aLine):
record = RecordLayout(aLine.split('\t'))
...
Fixed Layout.
from collections import namedtuple
RecordLayout = namedtuple('RecordLayout',['field1','field2','field3',...])
def process(aLine):
fields = (aLine[:10], aLine[10:20], aLine[20:30], ...)
record = RecordLayout(fields)
...
В зависимости от сложности и изменчивости вашей работы вы должны рассмотреть инструмент ETL, такой как SSIS (службы интеграции SQL Server).
Некоторые из файлов, которые мы получаем, трудно разобрать. Существуют ли какие-либо специальные инструменты, которые поставляются с SSIS, мы можем нас отличать от стандартного импорта файлов? – Ryan
Пожалуйста, сообщите больше о форматах. В общем, SSIS позволит вам анализировать практически любой формат - фиксированное поле, разделитель, XML и т. Д. При необходимости довольно легко написать свои собственные синтаксические анализаторы, которые вписываются в SSIS, так что нужна только функция синтаксического анализа. –
Я не знал, что вы можете использовать собственные функции синтаксического анализа внутри SSIS. Мне нужно будет изучить это больше. Благодаря! Я смотрел на покупку инструмента, такого как Advanced ETL Processor Ent. – Ryan
Можете ли вы показать мне образец сценария, который вы используете для синтаксического анализа? Я не нашел отличных образцов, которые показывают пользовательский синтаксический анализ файлов. – Ryan
@Ryan: Все программы на Python, которые читают файл, являются «настраиваемыми файловыми парсерами». У вас есть встроенные парсеры для XML, CSV, JSON, YAML и некоторых других. Вы можете загружать парсеры для электронных таблиц XLS. Поскольку ваш вопрос просто говорит «обычай», нецелесообразно пытаться предоставить какой-либо код. Вам нужно предоставить пример файла. –
Файлы, в которые мы попали, иногда находятся в странных форматах и могут потребовать от нас выполнить собственный пользовательский синтаксический анализ, чтобы получить из них нужные нам данные. Они разделены табуляцией по большей части, но иногда они даже не загружаются с помощью SSIS, используя настройки с разделителями табуляции. Ниже приведен пример того, как мы импортируем парсинг теперь с C# в одном из файлов, которые мы загружаем. string lname = line.Substring (10, 20) .Trim(); string fname = line.Substring (30, 10) .Trim(); string mi = line.Substring (40, 1) .Trim(); – Ryan