LINUX.ORG.RU
решено ФорумTalks

Массовое редактирование CSV базы

 


0

1

Не знаю, куда отнести эту тему, поэтому пишу здесь.

Есть очень большая таблица в формате csv (over 9000).

В одной из колонок имеется текст в формате: abcdefghi (jkl).

Нужно сделать из неё две колонки: в первую поместить «abcdefghi», во вторую - «jkl».

Как это сделать программно?

На Питоне написал для начала - время жмёт.

import csv

infile = file("courses.csv", "r")
outfile = file("out.csv", "w")

reader = csv.reader(infile , dialect='excel')
writer = csv.writer(outfile , dialect='excel')

for inrow in reader:
    
    course_code = inrow[0][inrow[0].find("(")+1:inrow[0].find(")")]
    course_name = inrow[0][:inrow[0].find("(")][:-1]

    writer.writerow([course_code]+[course_name]+inrow[2:])
    
    continue

infile.close()
outfile.close()

Ну и почитаю про этот ваш sed, когда время будет. Выглядит здорово.

papasha
() автор топика
Ответ на: комментарий от papasha

У CSV свои мелочи с форматом разбития элементов, экранированием кавычек, переносом строк. Python — верное решение, лучше 20 читабельных строк на нём, чем однострочный кошмар на sed.

Dendy ★★★★★
()

Заменить скобки на \t и всё, не?

static_lab ★★★★★
()
sed 's/\([^(]*\) (\([^)]*\))/\1,\2/' <courses.csv >out.csv

Но это при условии, что нет неэкранированных кавычек, запятых и т.д., как Dendy пишет.

А ещё тот же regexp можно и в питоне использовать. Скомпилированные регэксы работают слегка быстрее ручного парсинга.

schizoid ★★★
()
Ответ на: комментарий от papasha
course_name, course_code = map(lambda x:x[:-1],inrow[0].split('('))
import re
rex=re.compile(r'(?P<name>\w+) \((?P<code>\w+)\)')
...
mo=rex.search(inrow[0])
if mo:
    course_name = mo.group('name')
    course_code = mo.group('code')
vsemnazlo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.