Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/63: Рейтинг темы: голосов - 63, средняя оценка - 5.00
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38

Открытие, поиск и замена текста, сохранение измененного файла

12.11.2011, 17:03. Показов 12769. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
приветствую!
необходимо реализовать программу чтобы она искала в файле ВСЕ заданные "выражения" заменяла их и сразу сохраняла в измененный файл, если реализовать построчное чтение и поиск то происходит очень долго (в исходном файле может быть более 2 млн строк)....
из общих учебников научился только открывать, вручную редактировать и сохранять в исходный или новый файл, надо добавить функцию обработки (поиск и замена во всем документе) перед сохранением

VB.NET
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
37
38
39
40
Imports System.IO
 
Public Class Form1
    Dim path As String
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        OpenFileDialog1.ShowDialog()
        path = OpenFileDialog1.FileName
        Label1.Text = OpenFileDialog1.FileName
        If OpenFileDialog1.FileName > " " Then
            Dim strreader As New StreamReader(OpenFileDialog1.FileName, System.Text.Encoding.UTF8)
            Dim text As String = strreader.ReadToEnd
            TextBox1.Text = text
            strreader.Close()
        Else
            MessageBox.Show("Необходимо выбрать файл")
        End If
 
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        SaveFileDialog1.ShowDialog()
        path = SaveFileDialog1.FileName
        If SaveFileDialog1.FileName > " " Then
            Label2.Text = path
            WriteFile()
        End If
 
    End Sub
 
    Sub WriteFile()
        Dim strwr As New StreamWriter(path)
        strwr.Write(TextBox1.Text, System.Text.Encoding.GetEncoding(1251))
        strwr.Close()
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        WriteFile()
    End Sub
End Class

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

заранее спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2011, 17:03
Ответы с готовыми решениями:

Открытие и сохранение файла
Хочу в своей программе сделать сохранение и загрузка данных. (Button1) Подскажите, как правильно прочитать файл и полученные из него...

Открытие и сохранение текстового файла
Форма должна состоять их Textbox и 2 кнопок: сохранить и открыть. При нажатии на кнопке сохранить набранные в компоненте TextBox символы...

Поиск и замена текста в TextBox
Здравствуйте. Составляю программу, суть в следующем. В textbox1 вставляю текст, вида: <p>Знаете ли вы?</p> <div> ...

32
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
12.11.2011, 20:34
Интересное задание
Интересно именно работой с большим объёмом.
Пока ответить конкретно не могу(не в адеквате) , но направление такое: считывать блоками, обрабатывать, блоками и записывать.
Где-то есть именно такой пример.
Попробую найти
надо добавить функцию обработки (поиск и замена во всем документе) перед сохранением
Я бы немного изменил формулировку:перед сохранением под другим именем - не желательно портить файл источник!
И есчо: Не все могут вам помочь в этом разделе: приведённфй вами код будет работать только в NET, А это другоё раздел...
1
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
12.11.2011, 20:43  [ТС]
Цитата Сообщение от Alex77755 Посмотреть сообщение
Интересное задание
Интересно именно работой с большим объёмом.
Пока ответить конкретно не могу(не в адеквате) , но направление такое: считывать блоками, обрабатывать, блоками и записывать.
Где-то есть именно такой пример.
Попробую найти

Я бы немного изменил формулировку:перед сохранением под другим именем - не желательно портить файл источник!
И есчо: Не все могут вам помочь в этом разделе: приведённфй вами код будет работать только в NET, А это другоё раздел...

Спасибо, что отозвались!
интересно как эта функция реализована в ворде - он тоже блоками считывает...?
я так понимаю тему надо переместить?))))))))
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
12.11.2011, 20:45
VB.NET
1
2
3
        Dim Txt As String = IO.File.ReadAllText("C:\1.txt", System.Text.Encoding.Default)
        Txt = Txt.Replace("Old", "new")
        IO.File.WriteAllText("C:\2.txt", Txt, System.Text.Encoding.Default)
С миллионами строк не пробовал.
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
12.11.2011, 20:46
Если это из ворда, то как мне кажется можно обойтись вообще без NET
Во первых в каком формате файл источник?
0
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
12.11.2011, 20:52  [ТС]
файл в текстовой кодировке (читабилен в блокноте), если я правильно выражаюсь, с расширением *.sdf хотелось бы именно чтобы это была программа, т.к. в дальнейшем буду обрабатывать пачки файлов, поэтому именно VB а не VBA кроме того хороший пример на котором можно изучать программирование в VB чтение и запись и обработку файлов
Спасибо!
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
12.11.2011, 21:02
хотелось бы именно чтобы это была программа
В NET мало опыта, но сталкивался с тем, что в нём не работают функции "Open .....For...As"
А пример был именно на таком чтении. Наверняка в NET тоже имееется возможность чтения большими блоками.
Но с другой стороны если нужно именно приложение, то никто не мешает написать его на бейсике
Тут, конечо, могут возникнуть вопросы об ОС и кросплатформенности
0
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
12.11.2011, 21:04  [ТС]
Цитата Сообщение от Памирыч Посмотреть сообщение
VB.NET
1
2
3
        Dim Txt As String = IO.File.ReadAllText("C:\1.txt", System.Text.Encoding.Default)
        Txt = Txt.Replace("Old", "new")
        IO.File.WriteAllText("C:\2.txt", Txt, System.Text.Encoding.Default)
С миллионами строк не пробовал.
Памирыч, а оно в тексте все встречающиеся "Old" заменит на "new"?

и еще такой вопрос: есть строка
________09261114282D
ee надо заменить на
__-ISIS-__09261114282D
где _ это пробелы
логика: найти строку которая начинается с восьми пробелов после которых следует 12 любых цифр и буква D и заменить все пробелы на " -ISIS- " как это реализовать?
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
12.11.2011, 21:11
Цитата Сообщение от igorlab Посмотреть сообщение
все встречающиеся "Old" заменит на "new"?
Да, с учетом регистра.
Если перед классом формы напишешь
VB.NET
1
Option Compare Text
То будет менять независимо от него.

Цитата Сообщение от igorlab Посмотреть сообщение
найти строку которая начинается с восьми пробелов после которых следует 12 любых цифр и буква D
В этом лучше всего помогут регулярные выражения.
В них я не силен, но тут точно есть специалисты, надо их просто подождать.
1
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
12.11.2011, 21:17  [ТС]
спасибо! теперь хоть знаю что искать надо в загадочных "регулярных выражениях"
0
 Аватар для KingManiya
203 / 203 / 13
Регистрация: 14.10.2011
Сообщений: 227
12.11.2011, 23:00
Лучший ответ Сообщение было отмечено как решение

Решение

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
        Dim input As String = "        09261114282D"
        Dim output As String = input
 
        Dim pattern As String = "^        [0-9]{11}D"
 
        Dim regexp As Regex = New Regex(pattern)
 
        If regexp.IsMatch(input) Then
            output = input.Replace("        ", "-ISIS-")
        End If
 
        MsgBox(output)
В моем коде стоит 11 цифр и буква D, так как в предложенном примере 09261114282D 11 цифр и буква D
Исправляется на 12 в pattern

Думаю файл из нескольких млн будет все же долго обрабатываться...

VB.NET
1
Imports System.Text.RegularExpressions
Нужно добавить возле Imports System.IO

Так же после чтения текст не следует хранить в TextBox1. Во первых по умолчанию у него ограничение стоит на максимальное кол-во символов в нём. Во вторых отрисовываться сам текст в TextBox1 будет долго. В третьих работа с контролами медленнее, чем работа с переменными.
Поэтому лучше хранить многомлн текст в переменной. И с переменной же и работать.
4
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
12.11.2011, 23:01  [ТС]
Цитата Сообщение от Памирыч Посмотреть сообщение
VB.NET
1
2
3
        Dim Txt As String = IO.File.ReadAllText("C:\1.txt", System.Text.Encoding.Default)
        Txt = Txt.Replace("Old", "new")
        IO.File.WriteAllText("C:\2.txt", Txt, System.Text.Encoding.Default)
С миллионами строк не пробовал.

не подскажите - можно ли в функции Replace("str","str1") использовать подстановочные символы
к примеру:
VB.NET
1
Txt = Txt.Replace("          ###########D", "  -ISIS-  ###########D")
с таким расчетом чтобы все цифры ### оставались такими же как и были а пробелы заменялись?
Спасибо!
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
12.11.2011, 23:07
igorlab, замена по маске? Не встечал в реализации replace.
А чем ответ KingManiya не устроил? Оно все и делается через регулярки.
1
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
12.11.2011, 23:12  [ТС]
Цитата Сообщение от KingManiya Посмотреть сообщение
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
        Dim input As String = "        09261114282D"
        Dim output As String = input
 
        Dim pattern As String = "^        [0-9]{11}D"
 
        Dim regexp As Regex = New Regex(pattern)
 
        If regexp.IsMatch(input) Then
            output = input.Replace("        ", "-ISIS-")
        End If
 
        MsgBox(output)
спасибо... пытаюсь "въехать" и применить...
сразу же вопрос - приведенная вами процедура предполагает построчное чтение файла, запись строки в масив и последовательную обработку каждого элемента массива приведенным вами кодом
вопрос номер2 как организовать построчную запись в файл.

Добавлено через 41 секунду
подходит... наверное.... пытаюсь разобраться в ответе KingManiya - просто если бы подстановочные символы работали то все бы сильно упростилось)))))))))))))))))))))))))))
0
 Аватар для KingManiya
203 / 203 / 13
Регистрация: 14.10.2011
Сообщений: 227
12.11.2011, 23:32
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        Dim pattern As String = "^        [0-9]{11}D"
 
        Dim regexp As Regex = New Regex(pattern)
 
        Dim Txt() As String = IO.File.ReadAllLines("C:\1.txt", System.Text.Encoding.Default)
 
        For x = 0 To Txt.Length - 1
            If regexp.IsMatch(Txt(x)) Then
                Txt(x) = Txt(x).Replace("        ", "-ISIS-")
            End If
        Next
 
 
        IO.File.WriteAllLines("C:\2.txt", Txt, System.Text.Encoding.Default)
Добавлено через 11 минут
Вот сделал пример. 2 кнопки на форме.
1 создает файл со всякой фигней и иногда нужными случайными числами
2 кнопка считывает, заменяет и сохраняет.

VB.NET
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
37
Imports System.Text.RegularExpressions
 
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim text(2000000) As String
        For x = 0 To 2000000
 
            If x Mod 10000 = 0 Then
                text(x) = "        " & Rnd() * 55555555 \ 1 + 10000000000 & "D"
            Else
                text(x) = Rnd() * 5000000 & "rrrr fffff aaa" & x
            End If
        Next
 
        IO.File.WriteAllLines("C:\3.txt", text, System.Text.Encoding.Default)
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim pattern As String = "^        [0-9]{11}D"
 
        Dim regexp As Regex = New Regex(pattern)
 
        Dim Txt() As String = IO.File.ReadAllLines("C:\3.txt", System.Text.Encoding.Default)
        Dim y As Integer
        For x = 0 To Txt.Length - 1
            If regexp.IsMatch(Txt(x)) Then
                Txt(x) = Txt(x).Replace("        ", "-ISIS-")
                y += 1
            End If
        Next
 
 
        IO.File.WriteAllLines("C:\4.txt", Txt, System.Text.Encoding.Default)
        MsgBox(y)
    End Sub
End Class
Работает за пару секунд. В файле 2млн строк. 201 замена.
1
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
12.11.2011, 23:43  [ТС]
Спасибо огромное!!! Именно то что нужно было и работает намного быстрее чем тоже в ворде!!!!!!!!!!!!!!!!!!!
0
 Аватар для KingManiya
203 / 203 / 13
Регистрация: 14.10.2011
Сообщений: 227
12.11.2011, 23:46
Сам не ожидал, что будет работать так быстро
1
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
13.11.2011, 18:45  [ТС]
продолжение
есть текст имеющий вид:
*E*

EN300-80165
EN300-79725
EN300-80564
EN300-80189
EN300-80114
EN300-80012
EN300-80128
EN300-80104
EN300-79820
его надо преобразовать в текст вида:
"EN300-80165, EN300-79725, EN300-80564, EN300-80189, EN300-80114. EN300-80012, EN300-80128, EN300-80104, EN300-79820"
т.е. удалить строку "*E*", все пустые строки, и знаки перехода на новую строку на ", "

пробовал через
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     Dim pattern As String = "[*]E[*]"
                Dim regexp As Regex = New Regex(pattern)
                Dim Txt() As String = IO.File.ReadAllLines(OpenFileDialog1.FileName, System.Text.Encoding.Default)
                For x = 0 To Txt.Length - 1
                    If regexp.IsMatch(Txt(x)) Then
                        Txt(x) = Txt(x).Replace("[*]E[*]", "[кавычка]")
                    Exit For                    
                    End If
                    
                Next
 
                Dim pattern As String = "\n"
                Dim regexp As Regex = New Regex(pattern)
                Dim Txt() As String = IO.File.ReadAllLines(OpenFileDialog1.FileName, System.Text.Encoding.Default)
                For x = 0 To Txt.Length - 1
                    If regexp.IsMatch(Txt(x)) Then
                        Txt(x) = Txt(x).Replace("\n", ", ")
                    End If
                    Next
 
                IO.File.WriteAllLines("C:\2.txt", Txt, System.Text.Encoding.Default)
чего код серый...?

я так понимаю в функции
VB.NET
1
Replace("олд", "нью")
поля олд и нью не могут быть заданы как "\n" или[*]E[*] потому что она не воспринимает это как знаки форматирования, а ищет именно такую последовательность символов((((
как же их тогда задать?
Спасибо!
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
13.11.2011, 18:59

Не по теме:

Цитата Сообщение от igorlab Посмотреть сообщение
чего код серый...?
с кавычками переборщил ты



Заменить символ переноса строки на запятую
VB.NET
1
S = S.Relace(VbCrLf, ", ")
1
23 / 7 / 1
Регистрация: 12.11.2011
Сообщений: 38
13.11.2011, 19:11  [ТС]
так тоже пробовал -

VB.NET
1
2
3
4
5
6
7
8
9
Dim pattern As String = "VbCrLf"
                Dim regexp As Regex = New Regex(pattern)
                Dim Txt() As String = IO.File.ReadAllLines(OpenFileDialog1.FileName, System.Text.Encoding.Default)
                For x = 0 To Txt.Length - 1
                    If regexp.IsMatch(Txt(x)) Then
                        Txt(x) = Txt(x).Replace("VbCrLf", ", ")
                        strc = strc + 1
                    End If
                Next
не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2011, 19:11
Помогаю со студенческими работами здесь

Сохранение и открытие файла и занесение текста файла в ListBox
Здравствуйте! Вот никак не могу понять, прочитал уже столько тем на форуме, на http://msdn.microsoft.com/, но ничего не помогает. Мне нужно...

Изменение-удаление записи и сохранение измененного файла
составила базу данных(точнее файл с записями), все действия, которые было необходимо делать, сделала... сами записи выводятся в...

Сохранение файла на сервере, переданного и измененного скриптом
у меня следующий код var fileSelector = \$('#User_avatar');//input type='file' var avatarContainer =...

Замена Букв в файле и запись измененного файла в новый файл
Всем привет, мне нужно заменить буквы в файле и записать в новый файл. Я пытался сделать это, но в текстовый файл записывается только по...

Поиск файла и замена в нем текста
Доброго времени суток. Нужна помощь. Есть задача заменить в профиле Thunderbird, файле prefs.js, содержание одной строки на другую. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru