Замена точки с запятой для запятой в CSV с помощью регулярных выражений в Python - PullRequest
2 голосов
/ 10 июля 2019

Я работаю с файлом .csv и, как всегда, у него проблемы с форматированием. В данном случае это разделенная таблица ;, но есть строка, которая иногда содержит точки с запятой, например:

code;summary;sector;sub_sector
1;fishes;2;2
2;agriculture; also fishes;1;2
3;fishing. Extraction;  animals;2;2

Итак, есть три случая:

  • без точки с запятой -> нет проблем
  • символ слова (не числовой), точка с запятой, пробел, символ слова (не числовой)
  • символ слова (не числовой), точка с запятой, 2x пробел, символ слова (не числовой)

Я превратил .csv в .txt, затем импортировал его в виде строки, а затем скомпилировал это регулярное выражение:

re.compile('([^\d\W]);\s+([^\d\W])', re.S)

Что следует делать. Мне почти удалось заменить эти точки с запятой на следующие:

def replace_comma(match):
    text = match.group()
    return text.replace(';', ',')

regex = re.compile('([^\d\W]);\s+([^\d\W])', re.S)

string2 = string.split('\n')

for n,i in enumerate(string2):
    if len(re.findall('([^\d\W]);(\s+)([^\d\W])', i))>=1:
        string2[n] = regex.sub(replace_comma, i)

В основном это работает, но если после точки с запятой есть два пробела, после запятой остается \xa0. У меня есть две проблемы с этим подходом:

  • Это не очень просто
  • Почему он оставляет этот \xa0 символ?

Знаете ли вы лучший способ подойти к этому?

Спасибо

Редактировать: Мой желаемый результат будет:

code;summary;sector;sub_sector
1;fishes;2;2
2;agriculture, also fishes;1;2
3;fishing. Extraction,  animals;2;2

Редактировать: Добавлено объяснение о превращении файла в строку для лучшей манипуляции.

1 Ответ

1 голос
/ 10 июля 2019

Для этого случая я бы не использовал regex, split() и rsplit() с параметром maxpslit=:

data = '''1;fishes;2;2
2;agriculture; also fishes;1;2
3;fishing. Extraction;  animals;2;2'''

for line in data.splitlines():
    row = line.split(';', maxsplit=1)
    row = row[:1] + row[-1].rsplit(';', maxsplit=2)
    row[1] = row[1].replace(';', ',')
    print(';'.join(row))

Отпечатки:

1;fishes;2;2
2;agriculture, also fishes;1;2
3;fishing. Extraction,  animals;2;2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...