Я хочу заменить символ в 6-м столбце файла UNIX, который кажется немного сложным - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть CSV-файл, который содержит 9 полей и большее количество строк.Я хочу заменить "to" "в 6-м поле, кроме последнего и первого" все внутри него должно быть заменено "на" "

. Ниже приведены примеры входных и выходных файлов

Input

«MCDW», «6HV-00014», «CDW CORPORATION», «A931216», «», «INSTALL MOUNT PPI DISPLAY ДО 55« bsgdf »,« 28.08.2008 »,« 20180830212807"," "

Выход

" MCDW "," 6HV-00014 "," КОРПОРАЦИЯ CDW "," A931216 "," "," УСТАНОВИТЬ ДИСПЛЕЙ PPI УСТАНОВКИ НА СТЕНУ ДО 55 ""bsgdf», "08/28/2018", "20180830212807", ""

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Минимальное исправление - удвоение символа кавычки в этом конкретном месте в вашем тестовом вводе - достаточно просто с помощью чего-то sed или любого другого инструмента, который может выполнять основной поиск / замену:

$ sed 's/55" bsgdf/55"" bsgdf/' file.in > file.out

Предполагается, что файл file.in содержит соответствующую строку и что шаблон 55" bsgdf появляется только в том месте, где требуется обновление.

Ваша настоящая проблема на самом деле большеобщие?

Общепринятое соглашение для файлов в формате CSV - заключать в кавычки значения, используя символ кавычки ", а когда символ кавычки является частью значения, удвойте его - т. е. используйте" "- длязакодируйте его.

Например, для кодирования значений:

  • Нью-Йорк, Нью-Йорк
  • 179,98
  • Специальная ставка "149,99 $"

строка в CSV-файле будет выглядеть следующим образом:

"New York, New York","$179.98","Special rate ""$149.99"""

Но довольно просто создавать поврежденные CSV-файлы, наивно испуская строки, такие как:

"<val1>","<val2>",...,"<valN>"

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

"New York, New York","$179.98","Special rate "$149.99""

Мне кажется, что вы имеете дело с файлами, которые имеют эту последнюю проблему.

Часто можно исправить такие беспорядки, хотяОбщее решение невозможно (рассмотрите проблему, с которой вы столкнулись, если некоторые отдельные значения выглядят как "a","b","c").

Но если ваши данные не включают такие проблемные случаи, рассмотрите что-то вроде следующего.Это довольно грубо, преобразование CSV в не заключенные в кавычки текстовые данные с разделителями каналов, удвоение оставшихся символов кавычек, а затем преобразование с разделителями каналов обратно в CSV.Если ваши данные, естественно, содержат символ канала |, вам нужно использовать какой-то другой промежуточный разделитель.

#!/bin/sh

# sed commands (-e <cmd>)
#
#  delete leading "
#  delete trailing "
#  replace all "," sequences with |
#  replace all " chars with ""
#  return all | chars to ","
#  append trailing "
#  prepend leading "
#
# Assumes that the pipe character '|' is not part of data

sed  \
  -e 's/^"//'     \
  -e 's/"$//'     \
  -e 's/","/|/g'  \
  -e 's/"/""/g'   \
  -e 's/|/","/g'  \
  -e 's/$/"/'     \
  -e 's/^/"/'

Сохраните вышеприведенное, скажем, double_quotes.sh, сделайте файл исполняемым и используйтечерез что-то вроде:

$ ./double_quotes.sh < file.in > file.out

Приведенное выше разделяет некоторые понятия с ответом на основе perl от @ stack0114106: а именно, использование последовательности шагов замещения, применяемых по порядку.Такие последовательности часто больно читать и понимать, но они являются основными инструментами такого рода.

0 голосов
/ 20 сентября 2018

Вы можете сделать это, используя perl.Сначала я заменяю все двойные кавычки на два раза в шестом столбце шестнадцатеричным символом \ x22.Во-вторых, я проверяю, заканчивается ли первый и последний символ двойными кавычками.Если так, они удалены.Я добавил еще две записи, изменив 6-й столбец, чтобы показать, что он работает.Смотрите код ниже.

> cat 6th_column.dat
"MCDW","6HV-00014","CDW CORPORATION","A931216","","INSTALL WALL MOUNT PPI DISPLAY UP TO 55" bsgdf","08/28/2018","20180830212807",""
"MCDW2","6HV-00014","CDW CORPORATION","A931216","",INSTALL WALL MOUNT PPI DISPLAY UP TO 55" bsgdf,"08/28/2018","20180830212807",""
"MCDW3","6HV-00014","CDW CORPORATION","A931216","","INSTALL WALL MOUNT PPI DISPLAY "UP TO 55" bsgdf","08/28/2018","20180830212807",""
"MCDW3","6HV-00014","CDW CORPORATION","A931216","",INSTALL WALL MOUNT PPI DISPLAY "UP TO 55" bsgdf,"08/28/2018","20180830212807",""
>
> perl -a -F, -ne  ' $x=${F[5]}; $x=~s/\x22/\x22\x22/g;$x=~s/^\x22//g;$x=~s/\x22$//g;  print "$F[0],$x\n" ' 6th_column.dat
"MCDW","INSTALL WALL MOUNT PPI DISPLAY UP TO 55"" bsgdf"
"MCDW2",INSTALL WALL MOUNT PPI DISPLAY UP TO 55"" bsgdf
"MCDW3","INSTALL WALL MOUNT PPI DISPLAY ""UP TO 55"" bsgdf"
"MCDW3",INSTALL WALL MOUNT PPI DISPLAY ""UP TO 55"" bsgdf
>

дайте мне знать, если это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...