Использование Regex для удаления возврата каретки в CSV-файле в Notepad ++ - PullRequest
4 голосов
/ 23 июня 2009

У меня есть файл CSV, который мне нужно почистить. Это разовая вещь, поэтому я бы хотел сделать это в Notepad ++, если это возможно.

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

(.*)\"(.*)\n(.*)\"(.*)

Также исправьте меня, если я ошибаюсь, но я полагаю, что значение "заменить на" будет иметь следующий вид:

\1\2\3\4

Заранее спасибо.

Я также открыт для альтернативных решений, таких как быстрый и грязный сценарий PERL.

Ответы [ 8 ]

2 голосов
/ 24 июня 2009

После долгих поисков в StackOverflow я обнаружил шаблон регулярных выражений, предложенный для аналогичной проблемы, которую мне нужно было лишь слегка изменить из одинарных к двойным. Я запустил его в PERL. Работало отлично! К сожалению, я не могу найти оригинальное сообщение, чтобы отдать кредит, где кредит должен.

Во всяком случае, это то, что я наконец-то использовал. Спасибо всем за помощь!

$string123 =~ s/((?:^[^"]*"|(?!^))[^"]*?(?:"[^"]*"[^"]*?)*?)(\n{1,})/$1/g; 
2 голосов
/ 12 апреля 2012

Если кто-то еще найдет это и захочет получить реальный законный ответ на эту проблему в notepad ++, подумайте:

Используйте команду символа абзаца / показа невидимых символов для отображения CR и LF.

Теперь обратите внимание, что истинные переводы строк в конце каждой записи CSV обычно (зависит от того, что создало файл) ТОЛЬКО LFs. Настоящий разделитель записей НЕ ИМЕЕТ В ЭТОМ CR. И теперь обратите внимание, что возврат каретки, встроенный в поле и заключенный в кавычки, составляет обычно CR / LF (два непечатаемых символа рядом, CR и LF)!

Так что теперь ЭТО ПРОСТО. Выделите комбинацию CRLF, нажмите f & r, и ваша запись 'find what:' должна содержать два пустых поля для непечатаемой комбинации CRLF. Оставьте поле замены пустым и запустите его.

TADA! Больше нет встроенных возвратов каретки в кавычках, и все настоящие переводы строк остаются без изменений.

1 голос
/ 20 августа 2014

Я столкнулся с этой проблемой и победил, используя Notepad ++. Ответ Shreyas либо неправильный, либо устаревший, потому что теперь использование \ r \ n в поиске и замене регулярных выражений работает. Тем не менее, я использовал следующее:

[^"]"(([^"]*)\r\n([^"]*))+"

Как это работает, так это то, что оно соответствует:

[somethin0]"[somethin1]NEWLINE[somethin2]"

Где somethin1 и somethin2 равны \ 2 и \ 3 (а \ 1 - вся внутренняя часть), а somethin0 - символ-разделитель (скорее всего запятая). Чтобы получить то, что мы хотим, мы заменим:

[somethin0]"\2 \3"

И получите ожидаемый результат! Ну, в основном. Одиночная замена, как это, удаляет один символ новой строки в кавычках Однако, это должно быть лишь незначительным неудобством от спам-сообщения replaceAll несколько раз (где «несколько раз» - максимальное количество новых строк, присутствующих между кавычками)

1 голос
/ 03 августа 2011

У Барри есть решение, и, похоже, это лучшее решение, которое я могу найти где угодно, и я долго смотрел, потому что сначала обнаружил, что это решение не работает для меня в Perl.

Что я обнаружил, так это то, что небольшая поправка к этому регулярному выражению сработала. Я не уверен, причина этого нюанса, но Perl не может найти возврат каретки, когда ищет \ n, но находит возврат каретки, обозначенный в шестнадцатеричной форме /x0D.


Итак вместо:

$ string123 = ~ s / ((?: ^ [^ "] " | (?! ^)) [^ "] ? (?:" [^ "] " [ ^ "] ?) ?) ( \ n {1,}) / $ 1 / г;


Это сработало для меня:

$ string123 = ~ s / ((?: ^ [^ "] " | (?! ^)) [^ "] ? (?:" [^ "] " [ ^ "] ?) ?) ( \ x0D {1,}) / $ 1 / г;

Спасибо, Барри, большая помощь!

0 голосов
/ 14 мая 2010

Вот ответ специально для Notepad ++

Меню: TextFX > TextFX Edit > Delete Пустые строки

В этом пункте меню также есть опция Удалить лишние пустые строки.

0 голосов
/ 24 июня 2009

Ну ... мой RegEx ужасен, и я не могу ответить на ваш вопрос. Тем не менее, вот замечательная небольшая JS-функция, которую вы можете использовать и которая должна делать то, что вы хотите.

function removeNewLines(str){
    var quotedStrings = str.split(/["'](.*)?["']/g),
        i = 0;

    for( ; i < quotedStrings.length; i++){
        str = str.replace(quotedStrings[i], quotedStrings[i].replace(/[\r\n]/g,""));
    }
    return str;
}
removeNewLines("\"asdf\r\nas\"asdf\'as\nd\'asdf\"asdf\r\nasf\r\n\"") === "\"asdfas\"asdf'asd'asdf\"asdfasf\"";
0 голосов
/ 23 июня 2009

Нажмите кнопку π, чтобы отобразить скрытые символы. Затем выберите один символ возврата каретки. Нажмите Ctr + H и замените пустой строкой

Надеюсь, у вас это получится.

0 голосов
/ 23 июня 2009

Проблема с Notepad ++ заключается в том, что он не позволяет запускать регулярные выражения со специальными символами, такими как \ n или \ t. Регулярное выражение должно быть чистым регулярным выражением, а для специальных символов существует расширенный режим поиска.

Я бы посоветовал вам запустить свое регулярное выражение в Eclipse, если это возможно.

Если это невозможно, вот быстрое и грязное решение

Замените все \ n специальным символом, скажем, # или &, который в вашем файле не встречается иначе.

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

Наконец, замените оставшиеся специальные символы на \ n

...