Уберите переменное количество запятых из поля csv в двойных кавычках

0

Как я могу написать сценарий sed (или awk, просто не знакомый с ним), чтобы указать запятые на внутренности двоичного кода csv? Я могу удалить одну запятую, используя следующий sed-вкладыш sed:

sed 's/"\([^"]*\),\([^"]*\)"/\1\2/g' file > file2

Но если у меня есть две запятые в поле, у меня есть только одна запятая:

"АЛОХА, ИНК., АССОЦИАЦИЯ КОНДОМИНИИ"

становится

"АЛОХА, ИНК. АССОЦИАЦИЯ КОНДОМИНИИ"

В качестве альтернативы, если кто-то может объяснить мне, почему я не могу заставить опцию "ДОПОЛНИТЕЛЬНО ЗАВЕРШЕНА" использовать при загрузке csv в mysql, это сделало бы жизнь намного проще (я пытался используйте sed, чтобы запятнать запятые, потому что запятые уничтожают мои столбчатые данные, даже когда я использую опционально закрытую опцию, а мои поля заключаются в двойные кавычки. Экспорт Excel с кавычками только вокруг полей запятыми. Если все двойное кавычки, у меня нет проблема, но с выборочно-цитируемым я начинаю стучать ботинок на стол.

Обновление: файл содержит несколько полей.

"АЛОХА, ИНК., АССОЦИАЦИЯ КОНДОМИНИИ", 900, ВЕНЕЦИЯ, ФЛ, 34293-5112, ВЕНЕЦИЯ, ФЛ, 34285, АЛОХА

Я даже обеспокоен тем, что могут быть строки с несколькими полями с кавычками, которые, похоже, могут быть серьезной проблемой. Насколько я могу сказать, это не так уж и распространено.

Одна вещь, о которой я только думал, - это исключить все случаи "INC", но это не устранит другие примеры, такие как ", LLC" и т.д.

Я хочу удалить все запятые из поля.

Я беспокоюсь о таких случаях, как:

"ALOHA, INC., АССОЦИАЦИЯ КОНДОМИНИИ", 900, ВЕНЕЦИЯ, FL, 34293-5112, ВЕНЕЦИЯ, FL, 34285, "ALOHA, Inc., АССОЦИАЦИЯ КОНДОМИНИИ"

Разве не будут устранены запятые между первым экземпляром Алохи и последней инстанцией

sed 's/"\([^"]*\),\([^"]*\)"/\1\2/g' file > file2
  • 0
    Вы хотите сохранить двойные кавычки или устранить их?
  • 0
    ... и если вы знаете, какую версию sed вы используете?
Показать ещё 4 комментария
Теги:
csv
sed

2 ответа

1
Лучший ответ

Вы можете использовать GNU awk для этого случая

$ gawk -v FPAT='"[^"]*"|[^,]*' -v OFS=, '{for(i=1; i<=NF; i++) gsub(/,/, "", $i)} 1' ip.txt
"ALOHA INC. A CONDOMINIUM ASSOCIATION", 900, VENICE, FL, 34293-5112,,VENICE,FL,34285,"ALOHA Inc. A CONDOMINIUM ASSOCIATION"
  • -v FPAT='"[^"]*"|[^,]*' определяют поле ввода как поля с двойными кавычками или разделенные запятой
  • -v OFS=, запятая в качестве разделителя выходного поля
  • for(i=1; i<=NF; i++) петля над всеми полями ввода
    • gsub(/,/, "", $i) удалить все запятые
  • 1 печатать содержимое $0

Если gawk недоступен, вы можете использовать

perl -pe 's/"[^"]+"/$&=~tr|,||dr/ge' ip.txt

Примечание. Это не будет работать, если поле содержит двойную кавычку, новую строку и т.д. Использование парсеров csv доступных в perl, python и т.д.

  • 1
    Спасибо, Глубокий Это довольно сильное напоминание, чем мне нужно учить awk.
2

Если вы хотите удалить все вхождения запятых между " to " то следующее может вам помочь.

sed '/".*"/s/,//g'   Input_file

Используйте параметр sed -i если вы хотите сохранить вывод в самом файле Input_file.

  • 0
    ОП упоминает удаление одной запятой с поля с двумя запятыми .. не очень ясно, хотя ..
  • 0
    @ Sundeep Какую часть, если «Я хочу удалить все запятые из поля», вы не поняли?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню