У меня есть большой (25 миллионов строк) файл данных с разделителем (|
). Поставщик данных предоставляет файлы, и я запускаю автоматизированные задания, чтобы загрузить файлы в базу данных Redshift и затем обработать данные.
Ниже приведен пример данных:
123|110092|ACCT|"HC Account"|"Account1||||||||||||"Mary"|||"|"||||132|"STE|504"|1253|Unspecified Account|||N||ACTV|Active||||04/30/2013|12/31/2099|||||||||||||
Есть три набора полевых данных, которые я видел до:
- Текстовое поле заключено в двойные кавычки (
"
) Например:"HC Account"
,"Mary"
и"|"
. Это правильно, и данные должны быть загружены без кавычек. - Некоторые значения будут содержать разделитель канала. Например:
"STE|504"
. В этом случае поле обязательно должно быть заключено в двойные кавычки. Если это не так, он попадает в категорию три ниже. - Иногда предоставляется только начальная цитата, а конечная цитата отсутствует. Например:
"Account1
.
TL; DR: любое поле, начинающееся с
|"
, должно заканчиваться на"|
, Если это не так, и встречается другая|"
, первая двойная кавычка должна быть экранирована.
Итак, моя строка данных должна быть отредактирована, чтобы она стала следующей после предварительной обработки в Unix/Python/ другие предложения:
123|110092|ACCT|"HC Account"|"Account1||||||||||||"Mary"|||"|"||||132|"STE|504"|1253|Unspecified Account|||N||ACTV|Active||||04/30/2013|12/31/2099|||||||||||||
Я планирую написать сценарий Unix для изменения файла с помощью SED. Регулярное выражение, которое я написал до сих пор:
(\|")(?!([a-zA-Z0-9]|\s|\||\/)*("\|))
Однако это не соответствует строке правильно.
Вот ссылка на то, где я тестирую это: https://regexr.com/3toib
Я хочу, чтобы код был легковесным, поскольку средний размер файла составляет 3-5 ГБ, а таких файлов обычно несколько (более 10).
PS Redshift - это служба баз данных AWS, использующая Postgre SQL Engine, которая способна удалять кавычки из полей в правильных кавычках и экранировать специальное значение кавычки с помощью \
.
Кроме того, я готов сделать это на Python/ любом другом языке сценариев, учитывая, что код имеет небольшой вес.