Убрать нули с помощью регулярных выражений в CSV-файле - PullRequest
1 голос
/ 30 марта 2020

У меня есть CSV-файл с десятичными и целыми числами, которые представляют сумму денег, разделитель - точка с запятой. Пример файла:

00012,00;002200,21;00000;0000,00;0;
450000,21;056,01;0023,50;000000000000;
-032,23;-21.56;-00005630,05;

Я использовал это \b0*([1-9][0-9]*\,|0)\b для замены на $1 как это .

Однако результат должен быть:

12,00;2200,21;;0,00;;
450000,21;56,01;23,50;;
-32,23;-21.56;-5630,05;

Таким образом, если число является целым числом и имеет от 1 до неограниченного числа 0 цифр, в результате результат должен быть пустым (вставляется в базу данных как NULL), но если число является десятичным, результат должен быть 0,00.

Ответы [ 4 ]

1 голос
/ 30 марта 2020

Вы можете использовать

(?<=;|-|^)(?:0+|(0)+(,00?)0*)(?=[1-9]\d*,|;|$)

Заменить на $1$2. См. regex demo .

Подробности

  • (?<=;|-|^) - начало строки, ; или - должно быть непосредственно слева от текущего местоположения
  • (?:0+|(0)+(,00?)0*) - любой из двух вариантов:
    • 0+ - одна или несколько 0 цифр
    • | - или
    • (0)+(,00?)0* - одна или несколько 0 цифр с последней, захваченной в группе 1 ($1), за которой следуют ,, 0 и необязательный 0, записанные в группе 2, а затем ноль или более 0 цифр
  • (?=[1-9]\d*,|;|$) - должно быть число git от 1 до 9 с любым количеством любых цифр а затем , или ; или конец строки непосредственно справа от текущего местоположения.
0 голосов
/ 30 марта 2020

Если вы можете использовать lookahead и lookbehind, этот должен выполнить трюк:

(?<=(?:^|;)-?)0+(?=\d)

Объяснение:

  • Группа с положительным взглядом, содержащая:
    • группа без захвата, содержащая либо начало строки, либо точку с запятой
    • необязательный знак минуса.
  • хотя бы один ноль
  • группа с положительным прогнозом, содержащая хотя бы один десятичный символ.

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

Проверено:

https://regex101.com/r/2a2q5h/1

0 голосов
/ 30 марта 2020

Вот пример использования Perl и printf:

export LC_ALL=en_DK.UTF8 # some locale which uses commas as decimal separator

perl -Mlocale -nle '@fields = 
  map { if (/,/) {
          sprintf "%.2f", $_
        } else {
          $_+=0; 
          $_ ? $_ : "NULL"
        }
      } split /;/;
  print join(";", @fields)' test.csv 

Вывод:

12,00;2200,21;NULL;0,00;NULL
450000,21;56,01;23,50;NULL
-32,23;-21,56;-5630,05
0 голосов
/ 30 марта 2020

Объедините больше правил с |

rule1 0 * ([^ 0] \ d *, \ d * [^ 0]) 0 * rule2 0 * (0,0) 0 * rule3 0 * (0) rule4 0 * ([^ 0] \ d *)) rule5 0 * (0, \ d * [^ 0]) 0 * rule6 0 * ([^ 0] \ d *, 0) 0 * Будьте внимательны к тому, как вы привязываете начало и конец номера.

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