2016-09-27 3 views
-1

Мне нужно обрабатывать плоские файлы с разделителями-ограничителями, в которых каждое поле входит в двойные кавычки.Проблема при обращении с плоскими файлами с разделителями по трубе, каждое поле в двойных кавычках. Что может быть решением здесь

выборка данных:

"1193919"|"false"|""|"Mr. Andrew Christopher Alman"|""|""|"Mr." 

Я написал много команд поглазеть в моих сценариях. Теперь вопрос:

вопрос: Рассмотрим эту строку: "1193919|false||Mr. Andrew Christopher Alman"|""|"Mr." Мой сценарий берет выше, как 6 различных полей

"1193919 
false 
[null] 
Mr. Andrew Christopher Alman" 
[null] 
"Mr." 

Но данные файлы отправляются с намерением, что "1193919|false||Mr. Andrew Christopher Alman" должны быть приняты как одно поле, окруженное двойными кавычками.

Моя мысль: я думал сменить полевой разделитель from | to "|" У этого есть несколько вопросов. Последние и первые поля будут отображаться как "1193919 и Mr." . Я не хочу использовать '["][|]["]|^["]|["]$' в качестве разделителя полей, потому что это увеличит число полей, и мои другие коды должны будут идти, хотя основное изменение.

Я прошу о решении что-то вроде: Использование | как разделитель полей, только если за ним следует «и предшествует». Но полевой разделитель будет | а не «|»

выпуск 2:

"1193919""|"false"""|""|"Mr. Andrew Christopher Alman" 

В то же время я хочу сообщить об ошибке в "false""", что-то вроде /^"["]+ | ["]+["]$/ and not /^""$/ Хороших данных должен быть ниже формате

"1193919"|"false"|""|"Mr. Andrew Christopher Alman" 
+0

Хорошие решения ниже, но зачем отправлять данные с полевыми разделителями, встроенными в поля.Использовать значение для FS, которое отсутствует в данных, было бы другим решением этой проблемы. Удачи. – shellter

+0

Иногда у вас просто есть данные таким образом, поле данных может иметь только разделитель в качестве данных, и вы просто должны его обработать. Я пишу эти скрипты для обработки огромного количества данных (для хранилища данных). И я ожидаю всевозможные данные. Любые мысли по решению проблемы 2? – user6613676

ответ

2

вы можете использовать gawk ' с FPAT переменная для определения котируемых полей

$ gawk -v FPAT='[^|]*|"[^"]*"' '{print $1}' 

и добавить логику вокруг числа поля и т.д.

+0

Спасибо. Но как я могу преодолеть проблему 2, как я уже упоминал в вопросе? Каков фактический синтаксис для передачи ниже псевдокода./^ "["] + | ["] + ["] $/а не/^ "" $/ – user6613676

+0

Не могли бы вы объяснить свое решение? Я понимаю, что поле данных не может быть «|», или оно не может быть «в двойных кавычках». Но я хочу написать поле данных, также может быть «|», если в двойных кавычках. не считаться специальным символом (разделителем полей), когда внутри двойных кавычек – user6613676

+0

Теперь я понимаю решение. Но у меня нет опции FPAT с gawk в моей системе. ANy alternative? – user6613676

1

Основная идея заключается в том, чтобы обрабатывать все неровности перед тем awk (потому что многие нерегулярные случаи возможны и awk лучше всего работает на обычных файлах).

Вы можете заменить определенные шаблоны с уникальным символом, который не встречается в полях, а затем использовать его в качестве разделителя полей:

sed 's/"|"/"\t"/g' file.txt |\ 
awk -F '\t' '{for(i = 1; i <= NF; i++){print i, $i} }' 

Я хотел бы использовать что-то весьма маловероятно в тексте , например вертикальная вкладка \v. Если вы не уверены в содержании полей, вы можете определить символ, который отсутствует в текущем фрагменте данных, и обработать его с помощью этого символа в качестве разделителя.

Тот же подход работает для выпуска 2. Если вы знаете, что некоторые шаблоны неверны, вы можете либо исключить, либо исправить их перед обработкой, например. с

sed 's/\([^|"]\)"\+|/\1"|/g' 
+0

Спасибо, Андрей. Но я пишу для обработки огромной суммы данных для хранилища данных, и я понятия не имею, что не будет в поле данных. И любые мысли для проблемы 2, как я уже упоминал в вопросе .. Спасибо – user6613676

+0

Я обновил ответ. – Andrey

+0

Спасибо, Андрей. Есть ли у вас какие-либо идеи, каковы другие символы, которые вряд ли встречаются в тексте? – user6613676

Смежные вопросы