Удалите НЧ внутри указанного поля c и больше нигде - PullRequest
0 голосов
/ 04 февраля 2020

Меня попросили очистить данные в коллекции MongoDB, которую мы должны хранить в адресах и обобщить c контактные данные клиентов.

Данные иногда содержат возврат каретки, который, как правило, нарушает процесс загрузки, когда я помещаю данные sh в таблицу MySQL. Мой код использует Javascript, чтобы сделать a replace(/\n//g, '') в критических полях. Тем не менее, дамп данных все еще выглядит грязным, как показано здесь:

"_id"|"UserID"|"PhoneNumber"|"Source"|"PrivateLabelID"|"OptOut"|"Blocked"|"Deleted"|"Note"|"CreatedAt"|"UpdatedAt"|"FirstName"|"LastName"|"Email"|"Custom1"|"Custom2"|"Custom3"|"Custom4"|"Custom5"|"GroupIDs"
"5e37169df3369f47583355dc"|"127342"|"8645169963"|"1"|"1"|"undefined"|"undefined"|"undefined"|"Timothy.. I mainly buy in the SW area of Florida. Please send me what you have"|"1580668573"|"1580668573"|"Lee"|"Burnside"|"clemsonworldentertainment@gmail.com"|"undefined"|"undefined"|"undefined"|"undefined"|"undefined"|"[object Object]"
"5e3712c6958b2b1896070f2b"|"127342"|"8452063505"|"1"|"1"|"undefined"|"undefined"|"undefined"|"Yes I am looking in the lower to central Florida market. Multi family units."|"1580667590"|"1580667591"|"Daniel "|"Lepore"|"daniellepore@icloud.com"|"undefined"|"undefined"|"undefined"|"undefined"|"undefined"|"[object Object]"
"5e37107f61befe0bea740cfa"|"127342"|"3867770002"|"1"|"1"|"undefined"|"undefined"|"undefined"|"He's with Habib
His last name is not Thompson that Habib name"|"1580667007"|"1580667007"|"Thompson"|""|""|"undefined"|"undefined"|"undefined"|"undefined"|"undefined"|"[object Object]"
"5e370e08853f2702e40828fa"|"127342"|"4073712312"|"1"|"1"|"undefined"|"undefined"|"undefined"|"Indeed we are looking for Buy, Fix and Sell and strong rentals including duplexes, triplexes etc.
"|"1580666376"|"1580666376"|"Gisela "|"Escobar"|"jbetfinancial@gmail.com"|"undefined"|"undefined"|"undefined"|"undefined"|"undefined"|"[object Object]"
"5e3709f351798f62ea228e08"|"127342"|"4077774697"|"1"|"1"|"undefined"|"undefined"|"undefined"|"Yes I am buying in that area or any area in Florida if the numbers are right
only in Flipping houses

Поле «Примечание» является проблемой здесь. Что я запускаю cat --show-all filename, я вижу символ LF "$" в конце каждой записи , а также внутри поля "Примечание".

Я пытался tr '\n' ' ' <filename, но это удаляет все символы LF. Есть ли способ удалить символы LF только внутри поля «Примечание»?

PS: Файл необработанных данных (9 строк), если вы хотите проверить себя.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020

Допущения:

  • встроенный возврат / перевод строки отображается как один \n, когда файл проходит через od
  • , может быть более одного встроенного \n в файле
  • после удаления встроенных \n (s) в каждой строке должно быть 20 полей (разделитель = |)

Для этого примера I ' Я собираюсь работать с меньшим файлом, всего 6 полей в строке. Комментарии добавляются сюда только для целей документирования, ie, комментарии не существуют в реальном файле данных:

$ cat abc.dat
f1|f2|f3|f4                    # line1 part1
f4|f5|f6                       # line1 part2
g1|g2|g3|g4 g4|g5|g6           # line2
h1|h2|h3|h4 h4|h5|h6           # line3
i1|i2|i3|i4                    # line4 part1
f4|i5|i6                       # line4 part2
j1|j2|j3|j4 j4|j5|j6           # line5
k1|k2|                         # line6 part1
k3|k4 k4|k5                    # line6 part2
|k6                            # line6 part3
l1|l2|l3|l4 l4|l5|l6           # line7

Вместо того, чтобы пытаться сосредоточиться на удалении встроенного \n, мы мы просто добавим вместе строки (с пробелом между ними), пока у нас не будет 6 полей, а затем мы добавим наше \n в конце.

Одно awk решение (снова, комментарии только для целей документации):

awk -F"|" '
BEGIN          { prevNF=0    }                             # preset our previousNF to 0
(NF+prevNF)==6 { printf "%s\n",$0 ; prevNF=0 ; next      } # if we have 6 fields then print current line and terminate with a \n, then skip to next line of input
               { printf "%s " ,$0 ; prevNF=(prevNF+NF-1) } # otherwise print the line terminated with a space and save our current NF minus 1 (to account for fact current last field == first field of next line)
END            { printf "\n" }                             # one final \n to get us onto a new/blank line
' abc.dat

Запуск вышеуказанного для моего abc.txt файла дает нам:

f1|f2|f3|f4 f4|f5|f6
g1|g2|g3|g4 g4|g5|g6
h1|h2|h3|h4 h4|h5|h6
i1|i2|i3|i4 f4|i5|i6
j1|j2|j3|j4 j4|j5|j6
k1|k2| k3|k4 k4|k5 |k6
l1|l2|l3|l4 l4|l5|l6

Вот bash скрипка

0 голосов
/ 04 февраля 2020

Рассматривали ли вы использование агрегации в MongoDB для внесения изменений перед экспортом?

Если вам нужно оставить исходные данные без изменений, создайте новую коллекцию с измененными данными:

db.inputCollection.aggregate([{$addFields:{Note:{$reduce:{input:{$split:["$Note","\n"]}, initialValue:"", in:{$concat:["$$value","$$this"]}}}}},{$out:"outputCollection"}])

Разбивая это:

$addFields добавит новые поля в каждый документ, заменив все поля с тем же именем Установить Note на результат $reduce
для ввода в уменьшение, создайте массив, разделив поле Note на новой строке {$split:["$Note","\n"]}
поле in при редуцировании определяет функцию {$concat:["$$value","$$this"]}, которая объединяет текущее значение после предыдущего Эта стадия в конвейере примерно эквивалентна. split ("/ n"). join ("")

$out записывает вывод в имя коллекции, готовый для экспорта

Если можно изменить исходную коллекцию вы можете обновить это поле:

db.inputCollection.find({Note:/\n/},{Note:1}).forEach(function(d){  
  db.inputCollection.update({_id:d._id},{$set:{Note:d.Note.replace(/\n/g, '')}})
})
0 голосов
/ 04 февраля 2020

Я предполагаю, что вы пытаетесь удалить \n, если перед ним нет знака кавычки

sed ':a;N;$!ba;s/[^"]\n/ /g' filename.txt
...