2015-07-27 2 views
0

Привет, у меня есть файл csv, содержащий множество значений. Одна вещь, которую он содержит, - это денежная колонка. Примером файла является:Regex За деньги в CSV

...,...,...,$100,...,... 
...,...,...,$2,500,...,... 

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

Мое решение состоит в том, чтобы предварительно обработать файл, ищущий денежные значения, содержащие запятую, и просто удалите их. Тем не менее, у меня есть diffculty, пишущий регулярное выражение, чтобы сделать это.

Может ли кто-нибудь помочь?

+3

Regex для денег? Какова скорость? – sln

+7

это недопустимо CSV. '$ 2,500' в csv - два поля SEPARATE, один из которых содержит' $ 2', а другой - '5000'. Вы должны исправить все, что строится на этом csv, прежде чем вы даже попытаетесь проанализировать его. –

+0

Отправляя комментарий Marc B, я бы либо переключил делиметр с запятой на то, что, как вы знаете, не будет ни в одном из ваших полей (например, на трубе |) или не будет Впишите свои долларовые суммы с запятыми. – iobender

ответ

3

я проверил это в Python, но он должен работать так же в Java:

r"\$(\d{1,3}(?:,\d{3})*)" 

Я считаю, что вам, возможно, придется дважды вниз escape-символы для Java. Преодолевая его вниз:

\$ # match the dollar sign 
( # start group 
    \d{1,3} # match the first (or only) group of 1-3 digits, 
    (?: # start inner group, which we don't capture by itself 
    , # match a comma 
    \d{3} # followed by three digits 
)* # 0 or more of the inner group 
) # end expression 

Я испытал это на струне "...,$1,000,123,...$1" и он вернулся совпавшие группы ['1,000,123', '1']. Надеюсь, это поможет!

Edit:

Похоже, что вы можете уйти с этого в Java, заменяя отдельные символы обратной косой черты в приведенном выше с двойной обратной косой черты "\\".

Кроме того, как комментарий указано, удалите r перед строкой для использования в Java, поэтому в Java регулярное выражение будет:

pattern = "\\$(\\d{1,3}(?:,\\d{3})*)" 
+1

Это правильно (также удалите r перед строкой). +1 – maraca

2

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

Это соответствует только денежному полю прощальной запятой.

# "\\$(?:\\d+(?:,\\d{3})+(?:\\.\\d*)?)" 

\$ 
(?: 
     \d+ 
     (?: 
      , 
      \d{3} 
    )+ 
     (?: \. \d*)? 
) 

Это соответствует ошибочному или не денежному полю.

# "\\$(?:\\d+(?:,\\d{3})*(?:\\.\\d*)?|\\.\\d+)" 

\$ 
(?: 
     \d+ 
     (?: 
      , 
      \d{3} 
    )* 
     (?: \. \d*)? 
    | \. \d+ 
) 
1

Если все остальные поля не являются числовыми, вы можете прочитать весь файл, матч только запятые между цифрами, и заменить/удалить их. Вы можете использовать регулярные выражения, как:

(?<=\d)(,)(?=\d) 

DEMO

Смежные вопросы