Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как изменить конкретную строку в текстовом файле с помощью Vbscript (http://forum.oszone.net/showthread.php?t=219197)

neo21 29-10-2011 12:02 1784208

Как изменить конкретную строку в текстовом файле с помощью Vbscript
 
Добрый день! Помогите написать скрипт замены определенной строки текстовом файле с помощью Vbscript

megaloman 29-10-2011 12:30 1784220

neo21, что такое конкретная строка? Подробнее объясните задачу. Или это номер строки в текстовом файле? Или это подстрока, которую надо заменить во всём тексте? Что делать, если таких подстрок много? Чем подробнее объясните, тем скорее и качественнее получите ответ. ИМХО, копаться в чужом скрипте, чтобы его поменять, мало кому интересно, особенно если не ясно, что нужно получить.

neo21 29-10-2011 15:21 1784329

Вложений: 1
megaloman, - Это номер строки в текстовом файле, в файле .txt 266 строк, нужно заменить строку 3 на новую

megaloman 29-10-2011 17:39 1784418

Код:

fName = "D:\Delete\111.txt"                    ' Где текстовый файл

iStrok = 3                                      ' В какой строке меняем текст
repTxt = "У попа была собака, он её любил"      ' Какой текст поместим в указанную строку

Set FSO = CreateObject("Scripting.FileSystemObject")

Set F = FSO.OpenTextFile(fName, 1, False)      ' Открываем исходный текст файл для чтения
AllTxt = F.ReadAll()                            ' Cчитываем весь файл в строковую переменную
F.Close                                        ' Закрываем файл

AllTxt = Replace(AllTxt, vbLf, "")              ' Удаляем все символы перевода строки в переменной
Mas = Split(AllTxt, vbCr)                      ' Разбиваем полученную строку в массив. Резделитель - конец строки vbCr
nStrok = UBound(Mas)                            ' Макс значение индекса массива (Число строк -1 в исходном тексте- нумерация элементов массива с 0)

AllTxt = ""

If nStrok + 1 >= iStrok Then
    Mas(iStrok - 1) = repTxt                    ' Заменяем нужный элемент массива (строку текста) заданной
   
    For i = 0 To nStrok
        If i <> nStrok Then
            AllTxt = AllTxt + Mas(i) + vbCrLf  ' Формируем строку из элементов массива, вставляя символы конца и перевода строки
        Else
            AllTxt = AllTxt + Mas(i)            ' В конце последней строки ничего не ставим
        End If
    Next
   
    Set F = FSO.OpenTextFile(fName, 2, False)  ' Открываем исходный файл для записи
    F.Write AllTxt                              ' Записываем полученное на место исходного файла
    F.Close                                    ' Закрываем файл
End If


neo21 29-10-2011 17:53 1784425

megaloman, Спасибо большое, очень помогли мне.

Iska 29-10-2011 18:46 1784440

megaloman, вместо:
читать дальше »
Код:

AllTxt = Replace(AllTxt, vbLf, "")              ' Удаляем все символы перевода строки в переменной
Mas = Split(AllTxt, vbCr)                      ' Разбиваем полученную строку в массив. Резделитель - конец строки vbCr

можно просто:
Код:

Mas = Split(AllTxt, vbCrLf)
— это работает. Ну, и обратно — тоже:
Код:

AllTxt = Join(Mas, vbCrLf)

megaloman 30-10-2011 08:44 1784763

С учетом замечания Iska, скрипт существенно сократился
Код:

fName = "D:\Delete\111.txt"                    ' Где текстовый файл

iStrok = 3                                      ' В какой строке меняем текст
repTxt = "У попа была собака, он её любил"      ' Какой текст поместим в указанную строку

Set FSO = CreateObject("Scripting.FileSystemObject")

Set F = FSO.OpenTextFile(fName, 1, False)      ' Открываем исходный текст файл для чтения
AllTxt = F.ReadAll()                            ' Cчитываем весь файл в строковую переменную
F.Close                                        ' Закрываем файл

Mas = Split(AllTxt, vbCrLf)                    ' Разбиваем полученную строку в массив. Резделитель - конец строки и перевод строки vbCrLf

If UBound(Mas) + 1 >= iStrok Then
    Mas(iStrok - 1) = repTxt                    ' Заменяем нужный элемент массива (строку текста) заданной
   
    AllTxt = Join(Mas, vbCrLf)                  ' Консолидируем массив в строку для записи
   
    Set F = FSO.OpenTextFile(fName, 2, False)  ' Открываем исходный файл для записи
    F.Write AllTxt                              ' Записываем полученное на место исходного файла
    F.Close                                    ' Закрываем файл
End If


Iska 30-10-2011 14:15 1784923

megaloman,
Код:

nStrok = UBound(Mas)                            ' Макс значение индекса массива (Число строк -1 в исходном тексте- нумерация элементов массива с 0)
потерялся в новом коде. Потому я стараюсь всегда пользовать «Option Explicit».

Наверное, Вы хотели совсем «nStrok» исключить, наподобие:
Код:

If UBound(Mas) + 1 >= iStrok Then
и присвоение — убрали, а строку с условием поправить подзабыли?!

megaloman 30-10-2011 15:47 1785011

Спасибо Каюсь! Каюсь Каюсь! Спешка. Исправил...


Время: 22:30.

Время: 22:30.
© OSzone.net 2001-