Как заменить эти значения в строках текста - PullRequest
0 голосов
/ 31 января 2019

У меня есть несколько строк текста.Первая строка является строкой заголовка, а каждая последующая строка представляет поля данных, каждое значение разделяется запятой.В каждой строке находятся значения от одного до трех долларов, начиная от однозначных долларовых значений (4,50 долл. США) до трехзначных (100 000,34 долл. США).Они также окружены цитатами.

206360941,5465685679,"$4,073.77",567845676547,"$88,457.21",34589309683

Мне нужно исключить кавычки и знак доллара для денежных значений, а также запятую внутри.Разделитель периодов для десятичного значения должен оставаться, поэтому «$ 6 801,56» становится 6801,56

Я использовал регулярное выражение для удаления знака доллара, а также кавычки -

with open("datafile.csv", "r") as file:
    data = file.readlines()

for i in data:
    i = re.sub('[$"]', '', i)

, которые затемделает данные похожими на 7545245,6,801.56,3545647, поэтому, если я разделю их запятыми, большие значения будут разделены на две части.воссоединение с .join (), но оказывается, что только значения валют с запятой содержат кавычки, меньшие значения без запятой - нет.

Кроме того, я знаю, что могу использовать re.findall(r'\$\d{1,3}\,\d\d\d\.\d\d', i), чтобы вытянуть числовой формат, если я его распечатаю, он выведет список вроде [$100,351.35]

Я просто не уверен, что делатьделать с этим после этого.

Ответы [ 4 ]

0 голосов
/ 31 января 2019

Кажется, это работает:

>>> data = '206360941,5465685679,"$4,073.77",567845676547,"$88,457.21",34589309683'
>>> re.findall(r'"\$((\d+),)*(\d+)(\.\d+)"', data)
[('4,', '4', '073', '.77'), ('88,', '88', '457', '.21')]
>>> re.sub(r'"\$((\d+),)*(\d+)(\.\d+)"', r'\2\3\4', data)
'206360941,5465685679,4073.77,567845676547,88457.21,34589309683'

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

Вот почему вам нужна эта группа ((\d+),)*, которая захватывает подгруппу и запятую.Вы должны заменить всю эту группу подгруппой.

0 голосов
/ 31 января 2019
0 голосов
/ 31 января 2019

Прежде всего вы можете удалить все запятые внутри кавычек.

Псевдокод может выглядеть следующим образом:

s = Your String
insideQuotes = false;
charIndex = 0;
while (c = nextChar() != null){
    if(c == "\""){
        insideQuotes = !insideQuotes;
    }else if(insideQuotes && c == ","){
        s.removeAt(charIndex, "");
        charIndex--;
    }
}

Теперь, когда в кавычках больше нет запятых, вам нужно только удалить знаки доллара и сами кавычки!

Надеюсь, это поможет!

0 голосов
/ 31 января 2019

Я бы порекомендовал использовать csv.reader (или csv.DictReader, если вы хотите выполнить другую обработку для каждого столбца), чтобы прочитать файл, так как это автоматически проанализирует каждый столбец.Прочитав файл, вы можете выполнить регулярное выражение для каждого столбца, поэтому не нужно разбивать строку самостоятельно.Я полагаю, что по умолчанию delimiter и quotechar для csv.reader - это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...