У меня есть файл .csv, и мне нужно сделать следующее: для каждая строка, начиная с конец строки, текст, который встречается после определенного количества вхождений указанного символа, должен быть заключен в кавычки.
Я постараюсь объясниться на примере. Рассмотрим следующую строку csv:
gentlemen, this is a block of text. Thanks!,1,0,0,1
Я хочу заключить в кавычки часть строки, которая идет, начиная с конца, после четвертого появления запятой. Итак, должно получиться:
"gentlemen, this is a block of text. Thanks!",1,0,0,1
Я хотел бы сделать это в bash, чистом питоне или пандах.
Этот вопрос, вероятно, на самом деле должен был быть помечен как дубликат; это не может быть первый вопрос, который нужно задать: «Как мне сопоставить X в строке [до|после] Y числа Z, [вперед|назад]». Кроме того, можно обойтись циклами, пока вы не обнаружите регулярные выражения, а затем поймете, что регулярные выражения являются ожидаемой частью набора инструментов программиста. Текст на кнопке вниз: «Этот вопрос не показывает каких-либо исследований: он неясен или бесполезен». Это не оскорбление. Задавать хорошие вопросы SO сложно. 99% пользователей действительно должны были просто погуглить.
С СЭД:
$ sed -E 's/(.*)((,.*){4})/"\1"\2/' <<< 'gentlemen, this is a block of text. Thanks!,1,0,0,1'
"gentlemen, this is a block of text. Thanks!",1,0,0,1
При этом используются две группы захвата. Важная часть (,.*){4}
: это четыре экземпляра запятой, за которой следует что-либо. Поскольку первая группа соответствует жадно, вторая группа будет соответствовать последним четырем запятым в строке.
Затем замена заключает в двойные кавычки первую группу и печатает вторую группу без изменений.
В питоне:
line = r'gentlemen, this is a block of text. Thanks!,1,0,0,1'
num_commas = 4
comma_count = 0
for c in reversed(line):
from_end += 1
if c == ',':
comma_count += 1
if comma_count >= num_commas:
break
line[:-from_end]
# 'gentlemen, this is a block of text. Thanks!'
Остальное академично.
In [1]: line = r'gentlemen, this is a block of text. Thanks!,1,0,0,1'
...: a,b,c,d,*e = line[::-1].split(",")
...: print((','.join([a,b,c,d])[::-1] + "," + "'" + ','.join(e) + "'")[::-1])
...:
'gentlemen, this is a block of text. Thanks!',1,0,0,1
Это легко в чистом питоне. Просто выполните цикл с конца списка до тех пор, пока не будет выполнено ваше условие, отслеживая индекс. Остальное только нарезка. Вы можете понять это!