Как найти первую запятую в строке

I’m extracting rows from a txt file.

This row contains values like this:

 DESCRIPTION 1    1.234,00    15.980,00 [etc.]

I would like to extract these values (I mean only numeric values).

So I thought to find first comma, execute a for cycle backwards until first White space and execute a For cycle forward for decimals digits.
The I should go to the second comma and perform these cycles again.

Can you suggest some code that could be useful for my solution?

Ňɏssa Pøngjǣrdenlarp's user avatar

asked Jan 28, 2014 at 14:21

s.milziadi's user avatar

5

From your description, if you just need the decimal number before the comma, then you can do this with a pretty simple regex:

Dim s = "DESCRIPTION 1    1.234,00    15.980,00"
Dim pattern = "d+(.d+)?,d+"
Dim matches = System.Text.RegularExpressions.Regex.Matches(s, pattern)

For Each match in matches
    Console.WriteLine(match.Value)
Next

'Outputs:
'
'1.234,00
'15.980,00

Here’s a quick breakdown of the regex:

  • d+d is shorthand for [0-9], which just means “any numeric character”. The + just indicates “one or more”
  • . – this just matches a period character.
  • , – this just matches a comma.
  • ( ... ) – parentheses just creates a group (think of it as a sub-regex)
  • ? – question marks mean that the previous item is optional. In this case, that means that the group matching (.d+)? is optional, which allows you to match both 0.000,00 and 0,00

In that regex, if the comma and period are optional, then you can add a ? after them.

answered Jan 28, 2014 at 14:48

valverij's user avatar

valverijvalverij

4,8511 gold badge22 silver badges35 bronze badges

2

My Visual Basic knowledge is pretty limited, but can’t you utilize the IsNumeric function available in VB.NET?

Someting like this:

' initial string/row/etc
    Dim s As String = "DESCRIPTION 1 1.234,00 15.980,00"

    ' Split string based on spaces
    Dim words As String() = s.Split(New Char() {" "c})
    ' Use For Each loop over split and display them
    Dim word As String
    For Each word In words
        If IsNumeric(word) Then
            Console.WriteLine(word & " is numeric")
        Else
           Console.WriteLine(word & " is not numeric")
        End If
    Next

answered Jan 28, 2014 at 14:41

scheien's user avatar

scheienscheien

2,4571 gold badge19 silver badges22 bronze badges

I think you’ll be needing to look at System.Text.Regex.

Match m = Regex.Match("DESCRIPTION 1    1.234,00    15.980,00", ".*?( [0-9]*?.(?'n1'[0-9]+),(?'n2'[0-9]+)))
While m.Success
    System.Diagnostics.Debug.WriteLine(m.Groups["n1"].Value + "  "+m.Groups["n2"].Value);

    m = m.NextMatch()
End While

answered Jan 28, 2014 at 14:24

Chris Hammond's user avatar

Chris HammondChris Hammond

2,0545 gold badges27 silver badges52 bronze badges

5

If the columns are fixed width, you can get the values like this:

Dim input As String = "DESCRIPTION 1    1.234,00    15.980,00"
Dim col1 As String = input.SubString(17, 12).Trim()
Dim col2 As String = input.SubString(29).Trim()

answered Jan 28, 2014 at 14:57

Steven Doggart's user avatar

Steven DoggartSteven Doggart

43.2k8 gold badges68 silver badges104 bronze badges

2

Найдите и замените первую запятую в строке на пробел

Найдите и замените первую запятую в строке пробелом для всех строк в файле и для всех файлов в каталоге. Пожалуйста, только решения на основе Windows, у меня нет sed и т. Д. У меня есть notepad ++, регулярное выражение было бы хорошо.

Поместите все символы без запятой перед запятой в группу 1. Сопоставьте запятую. Получите все символы до конца строки/конца ввода в группу 2.

^([^,]*),(.*)$

Заменить на группу 1 + ” ” + группу 2.

1 2

Или…

  1. Скачать сед.
  2. Запустите это с sed 's/,/ /' blah1 > blah2
  3. ?
  4. Прибыль

Создан 13 фев.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

windows
regex
notepad++

or задайте свой вопрос.

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

Я извлекаю строки из текстового файла.

Эта строка содержит такие значения:

 DESCRIPTION 1    1.234,00    15.980,00 [etc.]

Я хотел бы извлечь эти значения (я имею в виду только числовые значения).

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

Можете ли вы предложить код, который может быть полезен для моего решения?

2014-01-28 14:21

4
ответа

Решение

Из вашего описания, если вам просто нужно десятичное число перед запятой, то вы можете сделать это с довольно простым регулярным выражением:

Dim s = "DESCRIPTION 1    1.234,00    15.980,00"
Dim pattern = "d+(.d+)?,d+"
Dim matches = System.Text.RegularExpressions.Regex.Matches(s, pattern)

For Each match in matches
    Console.WriteLine(match.Value)
Next

'Outputs:
'
'1.234,00
'15.980,00

Вот краткое описание регулярного выражения:

  • d+d это сокращение для [0-9], что означает “любой числовой символ”. + просто указывает “один или несколько”
  • . – это просто соответствует символу периода.
  • , – это просто соответствует запятой.
  • ( ... ) – круглые скобки просто создают группу (представьте, что это суб-регулярное выражение)
  • ? – вопросительные знаки означают, что предыдущий пункт не является обязательным. В этом случае это означает, что соответствие группы (.d+)? не является обязательным, что позволяет сопоставить оба 0.000,00 а также 0,00

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

2014-01-28 14:48

Я думаю, вам нужно будет посмотреть на System.Text.Regex,

Match m = Regex.Match("DESCRIPTION 1    1.234,00    15.980,00", ".*?( [0-9]*?.(?'n1'[0-9]+),(?'n2'[0-9]+)))
While m.Success
    System.Diagnostics.Debug.WriteLine(m.Groups["n1"].Value + "  "+m.Groups["n2"].Value);

    m = m.NextMatch()
End While

2014-01-28 14:24

Если столбцы имеют фиксированную ширину, вы можете получить такие значения:

Dim input As String = "DESCRIPTION 1    1.234,00    15.980,00"
Dim col1 As String = input.SubString(17, 12).Trim()
Dim col2 As String = input.SubString(29).Trim()

2014-01-28 14:57

Мои знания по Visual Basic довольно ограничены, но вы не можете использовать IsNumeric функция доступна в VB.NET?

Примерно так:

' initial string/row/etc
    Dim s As String = "DESCRIPTION 1 1.234,00 15.980,00"

    ' Split string based on spaces
    Dim words As String() = s.Split(New Char() {" "c})
    ' Use For Each loop over split and display them
    Dim word As String
    For Each word In words
        If IsNumeric(word) Then
            Console.WriteLine(word & " is numeric")
        Else
           Console.WriteLine(word & " is not numeric")
        End If
    Next

2014-01-28 14:41

Строка(((

Разор Маккалахан



Мастер

(1119),
закрыт



13 лет назад

Задача.Дана последовательность из n символов.Известно, что в последовательности имеется хотя бы одна запятая.Найти номер:
а). первой по порядку запятой;
б). последней по порядку запятой.
Использовать только циклы и функции, связанные и типом CHAR!!!!
Умоляю!!!!(((
Как я понял, надо задать строку, потом, если в этой строке есть запятая, то её надо поминять на цифру, то есть ord(i) i – строка!Только не знаю как правильно написать!

Propellerhead ViJ

Мастер

(1044)


14 лет назад

хм.. . я канеш бредовей сделал, но вот

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;
var
s:string;
n,p2,k:integer;
begin
s:=’tupo, stroka s, simvolami, nu i zapjataja est, da da’;
writeln(s);
writeln;
k:=0;
n:=length(s);
for n:=1 to n do
begin
if (s[n]=’,’) then
begin
k:=k+1;
p2:=n;
if k=1 then write(‘pervaja zapjataja – simvol nomer ‘,n);
end;
end;
writeln;
if k>1 then writeln (‘Poslednjaja zapjataja – simvol nomer ‘, p2);
writeln(‘end program’); readln;
end.

У меня работает

Павел Богомолов

Мастер

(2096)


14 лет назад

Зачем? Не надо такого делать. Надо просто получить номер по порядку этих запятых:
var
s: string;
i, first, last : integer;
begin
first := pos(s,’,’);
for i := 1 to length(s) do
if s = ‘,’ then last := i
end;

StAnger

Профи

(523)


14 лет назад

не правильно ты понимаешь – нужно найти позицию запятой в строке, на цифру менять запятую нет смысла. пробуй оператор pos(x,y). Инфы в нете полно. В цикле проверяешь каждый символ на содержание запятой, если это первая запятая, то пишешь ее место нахождение, ну и заодно проверяй – последняя запятая или нет. задача – не более 10-20 строк.

Источник: ХОЛОВА

Я извлекаю строки из текстового файла.

Эта строка содержит такие значения:

 DESCRIPTION 1    1.234,00    15.980,00 [etc.]

Я хотел бы извлечь эти значения (я имею в виду только числовые значения).

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

Можете ли вы предложить какой-нибудь код, который может быть полезен для моего решения?

4 ответа

Лучший ответ

Из вашего описания, если вам просто нужно десятичное число перед запятой, вы можете сделать это с помощью довольно простого регулярного выражения:

Dim s = "DESCRIPTION 1    1.234,00    15.980,00"
Dim pattern = "d+(.d+)?,d+"
Dim matches = System.Text.RegularExpressions.Regex.Matches(s, pattern)

For Each match in matches
    Console.WriteLine(match.Value)
Next

'Outputs:
'
'1.234,00
'15.980,00

Вот краткое описание регулярного выражения:

  • d+d – это сокращение от [0-9], что означает просто “любой числовой символ”. + просто означает “один или несколько”
  • . – это просто соответствует символу точки.
  • , – просто соответствует запятой.
  • ( ... ) – круглые скобки просто создают группу (воспринимайте это как подрегулярное выражение)
  • ? – вопросительные знаки означают, что предыдущий элемент является необязательным. В этом случае это означает, что сопоставление групп (.d+)? является необязательным, что позволяет сопоставить как 0.000,00, так и 0,00

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


2

valverij
28 Янв 2014 в 19:10

Мои знания Visual Basic довольно ограничены, но разве вы не можете использовать функцию IsNumeric, доступную в VB.NET?

Что-то вроде этого:

' initial string/row/etc
    Dim s As String = "DESCRIPTION 1 1.234,00 15.980,00"

    ' Split string based on spaces
    Dim words As String() = s.Split(New Char() {" "c})
    ' Use For Each loop over split and display them
    Dim word As String
    For Each word In words
        If IsNumeric(word) Then
            Console.WriteLine(word & " is numeric")
        Else
           Console.WriteLine(word & " is not numeric")
        End If
    Next


0

scheien
28 Янв 2014 в 18:41

Думаю, вам нужно будет взглянуть на System.Text.Regex.

Match m = Regex.Match("DESCRIPTION 1    1.234,00    15.980,00", ".*?( [0-9]*?.(?'n1'[0-9]+),(?'n2'[0-9]+)))
While m.Success
    System.Diagnostics.Debug.WriteLine(m.Groups["n1"].Value + "  "+m.Groups["n2"].Value);

    m = m.NextMatch()
End While


0

Chris Hammond
28 Янв 2014 в 18:54

Если столбцы имеют фиксированную ширину, вы можете получить следующие значения:

Dim input As String = "DESCRIPTION 1    1.234,00    15.980,00"
Dim col1 As String = input.SubString(17, 12).Trim()
Dim col2 As String = input.SubString(29).Trim()


0

Steven Doggart
28 Янв 2014 в 18:57

Добавить комментарий