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

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

NightSiren 15-02-2018 14:44 2798126

Переименование строк
 
Извиняюсь за банальность вопроса, но появилась такая вот задача:
Есть файл с данными в формате txt, к каждому "id" присвоено значение, в моём случае описания различных штуковин.
В оригинальном файле:
В роли "id" выступают строки - от STRING 3 до STRING 2788
Нужно их заменить на - от STRING 468 до STRING 3262
Так как ручками делать это довольно долго, решил обратиться к cmd, но особо не понял как в нём работать.
Полученный скрипт : (да, это всё что я понял)
FINDSTR STRING... C:\Users\User\Desktop\items.wts
Дальше просто не знаю как записать:
К результату каждого поиска прибавлять по 465 и перезаписывать в файл.
Откуда расхождение в 8 цифр, буду выяснять, видимо что-то упущено.

alpap 15-02-2018 15:31 2798134

NightSiren,
очень желательно знать что в STRING, можно ли считать STRING N шаблоном
а что в дальнейшем будет с этими строками, может проще сделать код, который меняет выходную строку перед выполнением действия над ней
команда STRING N+465 (ну это если намечаются какие-то действия, а не просто перезапись, но для чего-то и она нужна ведь)

megaloman 15-02-2018 15:37 2798136

NightSiren, Не догоняю. Надо взять строки с 468 по 3262, удалить кусок с 3 по 2788 и вставить, начиная с 3 строки, взятые строки. Иначе непонятно, ведь 2788-3+1=2786<>2795=3262-468+1
Вам что, надо получить в файле 2 одинаковых куска?
Или, начиная с 468 строки взять 2786 значений и заменить строки с 3 по 2788 ???

NightSiren 15-02-2018 19:04 2798184

Смотрите, нужно просто взять и переименовать строки:
STRING 3 --> STRING 468
STRING 4 --> STRING 469
STRING 5 --> STRING 470
....
STRING 2788 --> STRING 3253
После того как найду, куда делись 8 строк, запущу скрипт ещё раз.
Я не знаю как это должно быть реализовано, но я выложил свои мысли по этому поводу. Может есть способ сделать это легче.

megaloman 15-02-2018 20:51 2798199

vbs-скрипт
Код:

Txt = "Z:\Box_In\Эпидерсия.txt"
N1 = 3
N2 = 2788
M1 = 468
M2 = 3262

Set FSO = CreateObject("Scripting.FileSystemObject")

On Error Resume Next
Set inFile = FSO.OpenTextFile(Txt, 1)
If Err.Number <> 0 Then
    MsgBox Txt + vbCrLf + Err.Description
    WScript.Quit 1
End If
On Error GoTo 0

AllTxt = inFile.ReadAll
inFile.Close

Mas = Split(AllTxt, vbCrLf)
UMas = UBound(Mas)
LMas = LBound(Mas)

For i = N1 To N2
    If i + LMas - 1 <= M2 - LMas And i + LMas - 1 <= UMas Then
        Mas(i + LMas - 1) = Mas(i + LMas - 1 + M1 - N1)
    End If
Next

On Error Resume Next
Set inFile = FSO.OpenTextFile(Txt, 2, True)

If Err.Number <> 0 Then
    MsgBox Txt + vbCrLf + Err.Description
    WScript.Quit 1
End If
On Error GoTo 0

For Each S In Mas
    inFile.WriteLine S
Next
inFile.Close


NightSiren 15-02-2018 22:22 2798212

Вложений: 1
megaloman
Спасибо за скрипт, но он работает немного кривовато:
Под строкой я имел ввиду слово STRING, но не номер строки.
Сам файл выглядит вот так:
Файл 151269

NightSiren 15-02-2018 22:39 2798216

Ладно, спасибо за помощь, найден другой способ это сделать (занять друга на 6 часов за небольшую сумму)

megaloman 16-02-2018 00:53 2798234

NightSiren,
Oм мани падме хум! Мне Ваших денег не жалко, напрягает, что кто-то сделает мартышкин труд. Вот вариант после Вашего уточнения постановки
Код:

Txt = "Z:\Box_In\Эпидерсия2.txt"
N1 = 3
N2 = 2788
M1 = 468

Set FSO = CreateObject("Scripting.FileSystemObject")

On Error Resume Next
Set inFile = FSO.OpenTextFile(Txt, 1)
If Err.Number <> 0 Then
    MsgBox Txt + vbCrLf + Err.Description
    WScript.Quit 1
End If
On Error GoTo 0

AllTxt = inFile.ReadAll
inFile.Close

Mas = Split(AllTxt, vbCrLf)
UMas = UBound(Mas)
LMas = LBound(Mas)

i1 = N1
For k = LMas To UMas
    i = InStr(1, Mas(k), "STRING")
    If i > 0 Then
        Mas2 = Split(Mas(k), " ")
        If i1 = CInt(Mas2(LMas + 1)) Then
            Mas(k) = "STRING " + CStr(i1 + M1 - N1)
            i1 = i1 + 1
            If i1 > N2 Then Exit For
        End If
    End If
Next

On Error Resume Next
Set inFile = FSO.CreateTextFile(Txt, True)

If Err.Number <> 0 Then
    MsgBox Txt + vbCrLf + Err.Description
    WScript.Quit 1
End If
On Error GoTo 0

For Each s In Mas
    inFile.WriteLine s
Next
inFile.Close



Время: 01:02.

Время: 01:02.
© OSzone.net 2001-