Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 23, 2017 12:46:57

ivan812
Зарегистрирован: 2017-01-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел разного формата из csv-файла

Добрый день, друзья!

Есть csv-файл.
В нем могут быть числа разного формата (зависит от локали того кто сохранял файл)
Могут быть варинаты:

1,343,456.00
1.343.456.00
1,343,456,00
1 343 456.00
1343456.00
1343456

Можно ли стандратными средствами перевести такую строку в число?
Или только самому парсить строку (регуляркой)?

Подскажите плиз

Офлайн

#2 Янв. 23, 2017 12:57:28

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2583
Репутация: +  60  -
Профиль   Отправить e-mail  

Чтение чисел разного формата из csv-файла

можно убрать все точки и запятые в принцыпе и работать как с иинтом
а на выводе если надо уже делить правильно
разумеется это если все данные однотипные
к примеру
12,3 + 1,2 совершенно не тоже самое что 1,23 + 1,2
Но в вашем примере 1,343,456,00 и 1.343.456.00 и 134345600



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Отредактировано ZerG (Янв. 23, 2017 12:59:23)

Онлайн

#3 Янв. 23, 2017 13:34:08

ivan812
Зарегистрирован: 2017-01-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел разного формата из csv-файла

ZerG
можно убрать все точки и запятые в принцыпе и работать как с иинтом а на выводе если надо уже делить правильно разумеется это если все данные однотипные к примеру 12,3 + 1,2 совершенно не тоже самое что 1,23 + 1,2Но в вашем примере 1,343,456,00 и 1.343.456.00 и 134345600

Да, десятичные могут быть, не обязательно .00
То есть, стандартных функций для этого нет? Только самому обрабатывать такие записи чесел?

Офлайн

#4 Янв. 23, 2017 13:53:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Чтение чисел разного формата из csv-файла

ivan812
То есть, стандартных функций для этого нет?
Да тут разговоров больше чем кода понадобится

 from itertools import dropwhile
   
s = [
'.03',
'1,343,456.03',
'1.343.456.04   ',
'1,343,456,05',
'1 343 456.06',
'1343456.03',
'1343456'
]
   
def normalize(str_val):
    str_val = str_val.strip()
    try:
        sep = dropwhile(lambda x: x not in ",.", str_val[::-1]).next()
        h, t = str_val.rsplit(sep, 1)
        h = (h or "0").replace(" ", "")\
                      .replace(",", "")\
                      .replace(".", "")
        return float(h + "." + t)
    except StopIteration:
        return float(str_val)
  
for i in s:
    print(normalize(i))



Офлайн

#5 Янв. 23, 2017 14:07:23

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2583
Репутация: +  60  -
Профиль   Отправить e-mail  

Чтение чисел разного формата из csv-файла

зависит от локали того кто сохранял файл
Вобще это корень проблемы! Она вылезет потом еще и не в одном месте.

Вы же на заправляете бензиновый автомобиль соляркой или ракетным топливом (в зависимости от того что под рукой)?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Онлайн

#6 Янв. 23, 2017 18:46:08

ivan812
Зарегистрирован: 2017-01-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел разного формата из csv-файла

FishHook

Спасибо за пример!

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

Видимо нет такого способа, придется самому преобразовывать.

Офлайн

#7 Янв. 24, 2017 03:18:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Чтение чисел разного формата из csv-файла

ivan812
Есть csv-файл.
Файлы csv обрабатываются модулем csv. Какие там числа и в каком формате - это не важно. Если это csv он может быть разобран только одним способом - по спецификации csv-формата.

И вот когда ты их разобрал (распарсил), тогда у тебя есть список списков строк. И вот дальше эти строки ты можешь преобразовывать, как тебе надо. Ну, если тебе надо числа к единому виду привести, то ты пишешь функцию для обработки такой строки, в которой число в каком-то формате. И эта функция и должна знать, как число в любом формате привести к одному и тому же виду и вернуть такой результат.

ivan812
Могут быть варинаты:
1,343,456.00
1.343.456.00
1,343,456,00
1 343 456.00
1343456.00
1343456
Вот функция должна принимать строку, менять её как-то, переводить в число и возвращать это число.

Просто csv тут вообще ни при чём, все действия должны делаться уже после разбора, который выполняется единственным способом.



Отредактировано py.user.next (Янв. 24, 2017 03:21:34)

Офлайн

#8 Янв. 24, 2017 08:15:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Чтение чисел разного формата из csv-файла

ivan812
То есть, стандартных функций для этого нет? Только самому обрабатывать такие записи чесел?

Это не так. Стандартный способ есть.

В стандарте csv не определено понятие числа. Поэтому в общем случае число там сохранить нельзя и все ваши потуги на ваш страх и риск :).

Более того, csv это comma separated. И запятые в числах должны трактоваться как разделители полей.

Если вы хотите передавать числа, передавайте их в форматах которые предусматривают понятие целого и плавающего числа. К таковым относятся json, yaml, msgpack, protobuf, hdf5 и т.п. тогда никаких проблем с этим не будет.

Можно оставить tsv. Но тогда надо написать валидатор и не принимать данные в неправильном формате. Кто неправильно делает тот пускай на это и тратит время.

Если не можете на это повлиять, сами напишите экспортировщик, который будет делать экспорт единообразно, и именно в нем локализуйте особенности экспорта.

Я подозреваю откуда ваша проблема. Тут уже упоминалась ссылка https://habrahabr.ru/company/mailru/blog/129476/. Можете дать почитать тем кто делает экспорт.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version