Извлечь определенный текст и line
Цитата: Удаленный пользователь от 03.07.2022, 01:19Всем привет! Ребятки подскажите пожалуйста как реализовать парсер по строке?
У нас есть такая строка: 2022/07/03 00:58:29 9865296 cff9459d [INFO Client 16916] @From <2EASY> TornadoMachine: Hey I'd like to join your 5 way as clients`
В ней есть Дата, время, 2 хэша, инфо клиент, @from, ник и сам текст сообщения.
Как правильно извлечь из этой строки нужные тебе данные?Например добавив их в отдельные переменные:
data = 2022/07/03
time = 00:58:29
user = TornadoMachine
msg = Hey I'd like to join your 5 way as clients`Буду очень благодарен за помощь или хотя бы примеры
Всем привет! Ребятки подскажите пожалуйста как реализовать парсер по строке?
У нас есть такая строка: 2022/07/03 00:58:29 9865296 cff9459d [INFO Client 16916] @From <2EASY> TornadoMachine: Hey I'd like to join your 5 way as clients`
В ней есть Дата, время, 2 хэша, инфо клиент, @from, ник и сам текст сообщения.
Как правильно извлечь из этой строки нужные тебе данные?
Например добавив их в отдельные переменные:
data = 2022/07/03
time = 00:58:29
user = TornadoMachine
msg = Hey I'd like to join your 5 way as clients`
Буду очень благодарен за помощь или хотя бы примеры
Цитата: Удаленный пользователь от 03.07.2022, 16:01Привет.
Написал небольшой пример для твоего случая, я постарался немного поиграть с кодом и, надеюсь, показать что-нибудь интересное, помимо решения проблемы.
[spoiler title="Листинг"]Модельpublic class Message { public Message(string user, string text, DateTime timestamp) { User = user; Text = text; Timestamp = timestamp; } public string User { get; init; } public string Text { get; init; } public DateTime Timestamp { get; init; } }Парсер
public class Parser { private const int DateTimePartLength = 19; public static Message? Parse(string line) { // Извлечение данных по индексам // Лучше использовать AsSpan вместо Substring, т.к. TryParse принимает ReadOnlySpan<T> var isValid = DateTime.TryParse(line.AsSpan(0, DateTimePartLength), out var date); if (!isValid) { // Можно рассмотреть возможность использования исключений вместо возврата null или // более функционального подхода с условным классом Result<T>, т.е. объектом, указывающим на успех или неудачу return null; } var parts = line.Split(' '); // Предполагая, что формат – точный, можем вытащить нужные части из массива const int UserPartIndex = 9; // [..^1] — range operator (C# 8), чтобы не зацепить `:` // Также можно использовать Substring или даже TrimEnd // var user = parts[UserPartIndex].TrimEnd(':'); var user = parts[UserPartIndex][..^1]; // Сначала получаем IEnumerable<string> нужных элементов и обратно собираем из них строку var message = string.Join(' ', parts.Skip(UserPartIndex + 1)); return new Message(user, message, date); } }Пример использования
public static void Main() { var text = "2022/07/03 00:58:29 9865296 cff9459d [INFO Client 16916] @From <2EASY> TornadoMachine: Hey I'd like to join your 5 way as clients`"; var response = Parser.Parse(text); Console.WriteLine(JsonSerializer.Serialize(response, new JsonSerializerOptions { WriteIndented = true })); }[/spoiler]
Конечно, всегда можно рассмотреть возможность использования регулярных выражений, но всё зависит от конкретного случая.
Удачи в учёбе / работе!
Привет.
Написал небольшой пример для твоего случая, я постарался немного поиграть с кодом и, надеюсь, показать что-нибудь интересное, помимо решения проблемы.
public class Message
{
public Message(string user, string text, DateTime timestamp)
{
User = user;
Text = text;
Timestamp = timestamp;
}
public string User { get; init; }
public string Text { get; init; }
public DateTime Timestamp { get; init; }
}
Парсер
public class Parser
{
private const int DateTimePartLength = 19;
public static Message? Parse(string line)
{
// Извлечение данных по индексам
// Лучше использовать AsSpan вместо Substring, т.к. TryParse принимает ReadOnlySpan<T>
var isValid = DateTime.TryParse(line.AsSpan(0, DateTimePartLength), out var date);
if (!isValid)
{
// Можно рассмотреть возможность использования исключений вместо возврата null или
// более функционального подхода с условным классом Result<T>, т.е. объектом, указывающим на успех или неудачу
return null;
}
var parts = line.Split(' ');
// Предполагая, что формат – точный, можем вытащить нужные части из массива
const int UserPartIndex = 9;
// [..^1] — range operator (C# 8), чтобы не зацепить `:`
// Также можно использовать Substring или даже TrimEnd
// var user = parts[UserPartIndex].TrimEnd(':');
var user = parts[UserPartIndex][..^1];
// Сначала получаем IEnumerable<string> нужных элементов и обратно собираем из них строку
var message = string.Join(' ', parts.Skip(UserPartIndex + 1));
return new Message(user, message, date);
}
}
Пример использования
public static void Main()
{
var text = "2022/07/03 00:58:29 9865296 cff9459d [INFO Client 16916] @From <2EASY> TornadoMachine: Hey I'd like to join your 5 way as clients`";
var response = Parser.Parse(text);
Console.WriteLine(JsonSerializer.Serialize(response, new JsonSerializerOptions { WriteIndented = true }));
}
Конечно, всегда можно рассмотреть возможность использования регулярных выражений, но всё зависит от конкретного случая.
Удачи в учёбе / работе!
Цитата: Удаленный пользователь от 19.07.2022, 08:57Большое спасибо @dapofig необычная и очень удобная реализация! Спасибо за столь развернутый пример, очень помог, я пробовал через регулярные выражения, но твой пример более удобный)
Большое спасибо @dapofig необычная и очень удобная реализация! Спасибо за столь развернутый пример, очень помог, я пробовал через регулярные выражения, но твой пример более удобный)