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?
asked Jan 28, 2014 at 14:21
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 both0.000,00
and0,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
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
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 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 DoggartSteven Doggart
43.2k8 gold badges68 silver badges104 bronze badges
2
Найдите и замените первую запятую в строке на пробел
Найдите и замените первую запятую в строке пробелом для всех строк в файле и для всех файлов в каталоге. Пожалуйста, только решения на основе Windows, у меня нет sed и т. Д. У меня есть notepad ++, регулярное выражение было бы хорошо.
Поместите все символы без запятой перед запятой в группу 1. Сопоставьте запятую. Получите все символы до конца строки/конца ввода в группу 2.
^([^,]*),(.*)$
Заменить на группу 1 + ” ” + группу 2.
1 2
Или…
- Скачать сед.
- Запустите это с
sed 's/,/ /' blah1 > blah2
- ?
- Прибыль
Создан 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