удалить лишние нули из строки - PullRequest
2 голосов
/ 17 мая 2019

Я хотел бы написать выражение регулярного выражения для удаления лишних нулей из строки.REGEXP_REPLACE(REGEXP_REPLACE("Input_String","^0+", ''),'0+$','') терпит неудачу, если input_string = 120, затем output_string = 12 вместо 120.

Ниже приведен ожидаемый ввод против вывода:

120--> 120
12--> 12
120.00--> 120
000329.0--> 329
14.4200--> 14.42
000430--> 430 
0.24000--> 0.24
0.100--> 0.1
1.0--> 1

Ответы [ 4 ]

3 голосов
/ 17 мая 2019

Самый простой способ - использовать BigDecimal:

String stripped = new BigDecimal(input).stripTrailingZeros().toString();

Редактировать: на самом деле это не работает для 000430: строковое представление этого 4.3E+2.

Вы можете исправить это, убедившись, что scale равен по крайней мере нулю:

BigDecimal b = new BigDecimal(input).stripTrailingZeros();
if (b.scale() < 0) {
  b = b.setScale(0, RoundingMode.UNNECESSARY);
}
String stripped = b.toString();
1 голос
/ 17 мая 2019

Если вам нужно сделать то же самое в Hive, используйте приведение как десятичное (отрегулируйте до максимальной требуемой точности / масштаба):

select cast(str as decimal(30,5)) as fixed_number
from
(--test dataset
select stack(9, 
'120',
'12',
'120.00',
'000329.0',
'14.4200',
'000430',
'0.24000',
'0.100',
'1.0'
) as str
)s;

Результат:

OK
120
12
120
329
14.42
430
0.24
0.1
1
Time taken: 0.519 seconds, Fetched: 9 row(s)
1 голос
/ 17 мая 2019

Regex не всегда лучший инструмент для этого. В реальном коде я бы использовал решение Энди. Теперь, если вы действительно хотите сделать это с помощью регулярного выражения, вот один из возможных способов разложить его:

  • начало строки: ^
  • взять как можно больше 0: 0*
  • Начало захвата здесь : (
  • [0-9] максимально: [0-9]*
  • символьная точка (необходимо экранировать): \\.
  • [0-9] при несколько при возможности: [0-9]*?
  • Конец захвата здесь : )
  • как можно больше 0: 0*
  • конец строки: $

Вот код. Примечание: он не обрабатывает целые числа, но они могут обрабатываться аналогичным образом

Pattern pattern = Pattern.compile("^0*([0-9]*\\.[0-9]*?)0*$");
Matcher matcher = pattern.matcher("010.02010");

if(matcher.find()) {
    System.out.println("group 1 : " + matcher.group(1));
}

Выход :

group 1 : 10.0201

Как видите, разбор в BigDecimal более читабелен. Кроме того, использование регулярных выражений не обязательно более эффективно.

0 голосов
/ 17 мая 2019

просто сохраните этот файл delete_ending_zeroes_udf.py в системе hadoop со следующим содержимым.

delete_ending_zeroes_udf.py

import sys
import string
import re

def delete_ending_zeroes(x):
    if '.' in x:
        y = re.sub("0+$","", str(x))
        if len(y.split('.')[1])==0:
            y = y.split('.')[0]
    else:
        y = re.sub("^0+","", str(x))
    return y



while True:
    line = sys.stdin.readline()
    if not line:
        break

    line = string.strip(line, "\n ")
    Input_String = line.strip()
    outut_string = delete_ending_zeroes(Input_String)
    print("\t".join([Input_String, outut_string]))
#

и напишите следующий код в компиляции улья

add file hdfs:///delete_ending_zeroes_udf.py;

SELECT TRANSFORM (Input_String)
    USING 'python delete_ending_zeroes_udf.py' AS
    (outut_string string)
FROM <your_hive_table>

ссылка: https://acadgild.com/blog/hive-udf-python

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