Предположим, у нас есть текстовый файл следующего формата:
x,
xxx,
xx,
xxxxx,
xxx,
x,
xx,
и так далее.
При импорте данных в панду Python слова должны быть окружены символами «или». Используя notead++ или Pycharm (интерфейс vim), можно ли добавить какой-то ярлык для добавления «или» ко всем словам в этом файле, чтобы он выглядел следующим образом:
'x',
'xxx',
'xx',
'xxxxx',
'xxx',
'x',
'xx'
Я удерживал клавишу ALT в блокноте ++, чтобы добавить ' в тот же столбец текстового файла, но это работает только тогда, когда слова выровнены и имеют одинаковый размер. Я помню, как в конце девяностых мой друг использовал для этого ярлык в VIM, поэтому я решил спросить, как лучше всего это сделать, поскольку это очень распространенная операция. Когда файл действительно большой, я иногда использую функцию поиска и замены, но это работает только тогда, когда файл хорошо структурирован.
Есть ли передовой опыт в этом?
Обновлено: проясняя вопрос, я часто получаю файлы в «несколько» формате CSV. Я говорю «несколько», потому что обычно возникают проблемы. А пока давайте просто предположим, что я не могу использовать pandas.read_csv() и мне нужно скопировать и вставить данные в консоль Python для тестирования.
Файл будет иметь формат:
, col_name1, col_name2, col_name3, ... , col_namen ,
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
, col1, col2, col3, ..., coln ,
.
.
.
for n rows
Я никогда не знаю заранее, каким будет формат col1. Это может быть целое число, число с плавающей запятой, дата, текст или всякая ерунда, которую мне нужно отбросить.
Строки, являющиеся датами или строками, должны быть заключены в кавычки, чтобы я мог скопировать и вставить их в терминал Python.
Моя память, возможно, подводит, поскольку прошло более 20 лет, но я помню, как один из моих студентов из университета использовал vim, устанавливая курсор на colx, используя ярлык, а затем слова во всех строках, которые находились в позиции colx, были заключены в кавычки. Я много раз искал этот ярлык, но так и не нашел ничего похожего на него. Именно поэтому я решил спросить об этом здесь.
Кстати, пожалуйста, уточните, есть ли в ваших словах (например, «xxxxx») дефисы или цифры (разные системы регулярных выражений обрабатывают это по-разному).
В Vim есть много способов сделать это, но нет готовых решений для этой задачи. Вот некоторые из них.
Используя замену:
:%s/^[^,]*/'&'
где:
^
закрепляет рисунок в начале строки,[^,]*
соответствует любому символу, кроме запятой, ноль или более раз, как можно больше раз,'&'
заменяет совпадающий текст самим собой, в одинарных кавычках.Это приводит к цитированию всего, что стоит перед первым ,
. Конечно, шаблон необходимо будет скорректировать, чтобы учесть ведущие пробелы или другие особенности.
Использование одноразового макроса:
:%normal ^ct,'<C-v><C-r>"'
где:
:[range]normal <cmd>
выполняет обычный режим <cmd>
для каждой строки в [range]
, здесь для каждой строки в буфере,^
перемещает курсор на первый непустой символ строки,ct,
обрезает текст от курсора до первой запятой, исключая, и переходит в режим вставки,'
вставляет одинарную кавычку,<C-v><C-r>
— это то, как вы вставляете литерал <C-r>
(^R
) в этом контексте,^R"
вставляет текст, который был вырезан последним,'
вставляет еще одну одинарную кавычку.На практике у каждого есть плагин Surround, который, по общему признанию, делает это намного более интуитивно понятным:
:%normal ^yst,'
Оба подхода работают как есть с вашим первым примером текста и могут быть сопоставлены, если вам это нужно очень часто:
xnoremap <F5> :normal ^ct,'<C-r>"'<CR>
Здесь вы, вероятно, даже могли бы использовать AWK.
Однако все это очень просто, и ваше описание того, что сделал этот коллега, и ваш более реалистичный пример заставляют меня думать, что они либо:
Пользователи Vim, как правило, часто создают первый тип по мере развития их потребностей. Они, как правило, очень зависят от контекста, и их будет сложно воспроизвести с таким небольшим количеством информации. Более того, эмуляторы Vim, такие как IdeaVim, могут не иметь всех необходимых функций. Если вы хотите пойти по этому пути, то пара приведенных выше примеров будет такой же хорошей основой, как и любой другой, но вам придется проделать всю работу.
Поскольку эмуляторы Vim не являются Vim, сторонние плагины Vim использовать нельзя, и любой плагин, который использовал ваш коллега, не может использоваться в вашем контексте. Если вы можете использовать настоящий Vim, поищите специальный плагин, ориентированный на CSV, или, возможно, более низкоуровневый плагин, например тот, который предоставит текстовый объект «столбец», совместимый с вашим понятием «столбец». Предполагая…
ic
,тогда вам нужно будет только поместить курсор в столбец и сделать:
ysic'
Но это много предположений.
Привет, добрый день. Конечно, в Vim вы могли бы сделать что-то подобное,
%s/\w\+/"&"/g