В текстовом файле я хочу удалить ,
(запятые), а также "
(кавычки) (только если двойные кавычки содержат числа, разделенные запятыми).
56,72,"12,34,54",x,y,"foo,a,b,bar"
Ожидаемый выход
56,72,123454,x,y,"foo,a,b,bar"
Примечание. Я показываю приведенную выше строку в качестве примера. Мой текстовый файл содержит много строк, как указано выше, и числа, разделенные запятыми в двойных кавычках, должны различаться. Это,
56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"
Ожидаемый результат:
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"
В n
двойных кавычках присутствует число чисел, разделенных запятыми. А также оставьте двойные кавычки, которые содержат символы как есть.
Я люблю sed
инструмент обработки текста. Я рад, если вы опубликуете какое-либо sed
решение для этого.
text-processing
sed
csv
Авинаш Радж
источник
источник
56,72,"12,34,54",x,y,"foo,a,b,bar"
к56,72,123454,x,y,"a,b"
,foo
иbar
есть исчезают. Это ваш желаемый результат?foo
иbar
) удаляются вместе с запятыми. Кроме того, некоторые цитаты исчезают там, где остаются другие. Не говоря уже о том, что запятые между нимиa
иb
остаются, а также. Есть ли какая-то закономерность к этим?Ответы:
Это (адаптировано здесь ) должно делать то, что вам нужно, хотя Perl @ rici намного проще:
объяснение
:a
: определить метку с именемa
.s/(("[0-9,]*",?)*"[0-9,]*),/\1/
: Этот нужно разбить(foo(bar))
,\1
будетfoobar
и\2
будетbar
."[0-9,]*",?
: соответствует 0 или более0-9
или,
, а затем 0 или 1,
.("[0-9,]*",?)*
: соответствует 0 или более из вышеперечисленных."[0-9,]*
: соответствует 0 или более0-9
или,
сразу после"
ta;
: вернуться к меткеa
и запустить снова, если замена прошла успешно.s/""/","/g;
: Постобработка. Заменить""
на","
.s/"([0-9]*)",?/\1,/g
: удалить все кавычки вокруг чисел.Это может быть легче понять с другим примером:
Таким образом, хотя вы можете найти число, которое идет сразу после кавычки, за которым следуют запятая и другое число, соедините два числа вместе и повторяйте процесс до тех пор, пока он больше не станет невозможным.
На данный момент я считаю полезным упомянуть цитату,
info sed
которая появляется в разделе, описывающем расширенные функции, такие как метка, использованная выше (спасибо, что нашли @Braiam):источник
Если с perl все в порядке, вот короткий (и, вероятно, быстрый, если не обязательно простой :)) способ сделать это:
e
Флаг кs:::
оператору (это просто еще один способ написанияs///
) вызывает замену следует рассматривать как выражение , которое вычисляется каждый раз. Это выражение берет$1
захват из регулярного выражения (в котором уже отсутствуют кавычки) и переводит (y///
что также можно записать какtr///
) его, удаляя (/d
) все запятые.r
Флагy
необходим для того , чтобы получить значение , которое должно быть переведенная строка, вместо подсчета переводов.Для тех, кто почему-то чувствует себя запятнанным perl, вот эквивалент Python. Python на самом деле не является оболочкой с одним вкладышем, но иногда его можно заставить сотрудничать. Следующее может быть записано одной строкой (в отличие от
for
циклов, которые не могут быть), но горизонтальная прокрутка делает его (даже больше) нечитаемым:источник
y///
вместо того, чтобыtr///
спасти нас еще одного персонажа.Для данных CSV я бы использовал язык с настоящим анализатором CSV. Например с Руби:
источник
Привет Вот код Python для замены запятых на двойные кавычки, запятые заменяются символом трубы (|)
Этот код Python заменяет запятые в двойных кавычках
например: x, y, z, 1,2, "r, e, t, y", h, 8,5,6
если заменить на Pipe x, y, z, 1,2, «r | e | t | y», h, 8,5,6
если заменить на ноль x, y, z, 1,2, "rety", h, 8,5,6
источник