Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 2
1

Замена фразы по маске на другую фразу по маске в файле

16.09.2017, 14:29. Просмотров 2524. Ответов 2
Метки нет (Все метки)


Добрый день!
Имеется задача, которую, к сожалению, пока не могу реализовать:
Есть текстовый файл состоящий из множества строк. В нем нужно заменить первое вхождение фразы, удовлетворяющей маске "; день недели(3 символа) число (2 символа) месяц (3 символа) год (4 символа) время (hh:mm:ss) часовой пояс (всегда +0300)" (например,"; Fri, 30 Jun 2017 09:06:53 +0300"), на второе вхождение фразы, удовлетворяющей маске. Остальные фразы не трогать. Фраза всегда начинается с символа ";" и заканчивается на "+0300". Если бы вся фраза всегда располагалась на одной строке, проблем у меня это бы не вызвало. Но фраза может начаться на одной строке, а закончиться на другой.
Пример прилагаю.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2017, 14:29
Ответы с готовыми решениями:

Замена в текстовом файле строк по маске
подскажите, можно ли как то замену по маске делать в txt ? например надо найти <sup><a name=r3><a...

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

Замена цвета по маске в numpy
Здравствуйте господа. Помогите разобраться. У меня есть код на C++: Mat mask; inRange(image,...

Замена символов ячейки по маске
Добрый день. Не подскажете, можно ли взять текст с ячейки и по-символьно позаменять его сравнивая...

2
Администратор
Эксперт .NET
13114 / 10687 / 4407
Регистрация: 17.03.2014
Сообщений: 21,512
Записей в блоге: 1
16.09.2017, 19:46 2
Лучший ответ Сообщение было отмечено redman31 как решение

Решение

redman31, вот так попробуй
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string s = "aaaa; Fri\r\n, 30\r Jun\n 2017 09:06:53 +0300zzz\r\n" +
"aaaa; Sat, 01\rJul\r\n2017\n 09:06:53 +0300zzz\r\n" +
"aaaa; Sun, 02 Jul 2017 09:06:53 +0300zzz\r\n";
 
Match[] matches = Regex.Matches(s, @";(.+?)\+0300", RegexOptions.Singleline)
    .Cast<Match>()
    .Where(m => { 
        DateTime d;
        return DateTime.TryParseExact(m.Groups[1].Value.Replace("\r", " ").Replace("\n", " "), "ddd, dd MMM yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind | DateTimeStyles.AllowWhiteSpaces, out d);
    })
    .Take(2)
    .ToArray();
if (matches.Length == 2)
{
    s = s.Remove(matches[0].Index, matches[0].Length).Insert(matches[0].Index, matches[1].Value);
}
Если есть возможность использовать C# 7, то там можно немного упростить код благодаря out _ параметрам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
string s = "aaaa; Fri\r\n, 30\r Jun\n 2017 09:06:53 +0300zzz\r\n" +
"aaaa; Sat, 01\rJul\r\n2017\n 09:06:53 +0300zzz\r\n" +
"aaaa; Sun, 02 Jul 2017 09:06:53 +0300zzz\r\n";
 
Match[] matches = Regex.Matches(s, @";(.+?)\+0300", RegexOptions.Singleline)
    .Cast<Match>()
    .Where(m => DateTime.TryParseExact(m.Groups[1].Value.Replace("\r", " ").Replace("\n", " "), "ddd, dd MMM yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind | DateTimeStyles.AllowWhiteSpaces, out _))
    .Take(2)
    .ToArray();
if (matches.Length == 2)
{
    s = s.Remove(matches[0].Index, matches[0].Length).Insert(matches[0].Index, matches[1].Value);
}
1
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 2
19.09.2017, 23:30  [ТС] 3
Прошу прощения за поздний ответ и спасибо за код, который помог мне выбрать правильный вектор в решении задачи.
Итоговый код получился такой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        static void Main(string[] args)
        {
 
            string[] dirs = Directory.GetFiles(@"D:\mail\", "*.eml");
            try
            {
                foreach (string dir in dirs)
                {
                    Console.WriteLine(dir);
                    string file = String.Empty;
                    using (StreamReader read = new StreamReader(dir, Encoding.Default))
                    {
                        file = read.ReadToEnd();
                    }
                    Regex regex = new Regex(@";\s*[a-z]{3},\s*\d\d\s*[a-z]{3}\s*\d{4}\s*\d\d:\d\d:\d\d\s*\+0300", RegexOptions.IgnoreCase);
                    Match m = regex.Match(file);
                    string dateOld = String.Empty;
                    string dateNew = String.Empty;
                    if (m.Success)
                    {
                        dateOld = m.ToString();
                        dateNew = m.NextMatch().ToString();
                    }
                    using(StreamWriter writer =new StreamWriter(dir.Insert(dir.LastIndexOf('\\') + 1, "end\\"),false,Encoding.Default))
                    {
                        writer.WriteLine(file.Replace(dateOld, dateNew));
                    }
 
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Произошла ошибка: {0}", e.ToString());
                Console.ReadLine();
            }
        }
Обрабатываются файлы .eml, расположенные в папке D:\mail\, а итоговый результат записывается в папку D:\mail\end\
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2017, 23:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Поиск и замена строк по маске
Имеется строки с разделителем «;» в нескольких колонках файла Excel большого размера следующего...

Поиск в файле по маске
Здравствуйте! Имеется следующее задание: есть нормализованный файл с телефонными номерами, для...

Скопировать все фалы из одной папки в другую по маске
Всем привет! Знаю, что тема уже заезженная, и зная как скопировать один файл, вопрос встал в...

Поиск и замена ключей реестра по маске
Добрый день! Помогите пожалуйста советом в решении задачи - Необходимо рекурсивно найти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.