Регулярное выражение для поиска и замены неэкранированных непоследовательных двойных кавычек в файле CSV - PullRequest
3 голосов
/ 05 июля 2010

Это расширение к ответу на связанный вопрос Здесь

У меня есть еженедельный CSV-файл, который необходимо проанализировать. это выглядит так.

"asdf","asdf","asdf","asdf"

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

"asdf","as "something" df","asdf","asdf"

Из других постов здесь я смог составить регулярное выражение

(?m)""(?![ \t]*(,|$))

, который соответствует двум последовательным двойным кавычкам, только «если у них нет запятой или конца строки перед ними с необязательными пробелами и табуляцией между ними»

теперь он находит только двойные кавычки подряд. Как мне изменить его, чтобы найти и заменить / удалить двойные кавычки вокруг «чего-то» в файле?

спасибо.

Ответы [ 3 ]

6 голосов
/ 05 июля 2010
(?<!^|,)"(?!,|$)

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

Если вам нужно разрешить пробел вокруг запятых или в начале / конце строки, и если ваш regex-вариант (который вы не указали) разрешает просмотр произвольной длины (например, .NET делает), вы можно использовать

(?<!^\s*|,\s*)"(?!\s*,|\s*$)
3 голосов
/ 04 декабря 2014

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

"[^,"][^"]*"[^,]
0 голосов
/ 15 декабря 2017

В vim я использовал это, чтобы удалить все неэкранированные кавычки.

:%s/\v("(,")@!)&((",)@<!")&("(\n)@!)&(^@<!")//gc

подробное объяснение:

: - start the vim command
    % - scope of the command is the whole file
    s - search and replace
        / - start of search pattern
        \v - simple regex syntax (rather than vim style)
            (
                " - double quote
                (,") - comma_quote
                @! - not followed by
            )
            & - and
            (
                (",) - quote_comma
                @<!- does not precedes
                " - double quote
            )
            & - and
            (
                " - double quote
                (\n) - line end
                @! - not followed by
            )
            & - and
            (
                ^ - line beginning
                @<! - does not precedes
                " - double quote
            )
        / - end of search pattern and start of replace pattern
             - replace with nothing (delete)
        / - end of replace pattern
    g - apply to all the matches
    c - confirm with user for every replacement

это делает работу довольно быстро. Единственный сбой в этом случае - это когда в данных есть экземпляры шаблона ",".

...