У меня есть большой (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/ любом другом языке сценариев, учитывая, что код имеет небольшой вес.
