Как удалить запятые только из двойных кавычек внутри каждой строки в CSV с разделителями-запятыми? - PullRequest
0 голосов
/ 24 января 2019

У меня есть CSV-файл с разделителями-запятыми, в котором поля заключены в двойные кавычки, с которыми я пытаюсь работать в bash. Я хотел бы удалить запятые внутри поля в двойных кавычках для каждой строки. Я посмотрел на другие решения для вопроса, заданного здесь, и они вращались вокруг использования внешних библиотек для анализа CSV, что не подходит для моей ограниченной среды, где большая часть работы выполняется в awk и sed.

"A","B","C D","E, F","G"

желаемый вывод

"A","B","C D","E F","G"

Ответы [ 4 ]

0 голосов
/ 24 января 2019

Мне нравится рубин для однострочников CSV:

ruby -rcsv -ne '
  CSV.parse($_) {|row|
    puts row.map {|field| field.delete(",")}
            .to_csv(:force_quotes => true)
  }
'
0 голосов
/ 24 января 2019

С помощью sed для удаления всех запятых, за которыми следует один символ без кавычек, и запятых, перед которыми не стоит один символ без кавычек:

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

Edit:

Добавлен * квантификатор для соответствия последующим запятым.

0 голосов
/ 24 января 2019

С GNU awk и FPAT:

$ awk '
BEGIN {
    FPAT = "([^,]+)|(\"[^\"]+\")"  # field definition
    OFS=","                        # output field separator
}
{
    for(i=1;i<=NF;i++)             # loop all fields
        gsub(/,/,"",$i)}           # replace all commas in fields
1' file                            # output
"A","B","C D","E F","G"
0 голосов
/ 24 января 2019

Легко с модулем Perl's Text :: CSV_XS :

perl -MText::CSV_XS=csv -we 'csv(
    in           => shift,
    always_quote => 1,
    on_in        => sub { tr/,//d for @{ $_[1] } }
);' -- file.csv
  • in определяет ввод, shift просто берет один из аргументов командной строки
  • always_quote добавляет кавычки даже в поля, которые им не нужны
  • on_in вводит код для запуска в каждой строке, в этом случае он перебирает все ячейки в строке и удаляет запятые с помощью оператора транслитерации tr.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...