PDA

Показать полную графическую версию : [решено] Переименование строк


NightSiren
15-02-2018, 14:44
Извиняюсь за банальность вопроса, но появилась такая вот задача:
Есть файл с данными в формате 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
NightSiren,
очень желательно знать что в STRING, можно ли считать STRING N шаблоном
а что в дальнейшем будет с этими строками, может проще сделать код, который меняет выходную строку перед выполнением действия над ней
команда STRING N+465 (ну это если намечаются какие-то действия, а не просто перезапись, но для чего-то и она нужна ведь)

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

megaloman
15-02-2018, 20:51
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
megaloman
Спасибо за скрипт, но он работает немного кривовато:
Под строкой я имел ввиду слово STRING, но не номер строки.
Сам файл выглядит вот так:
151269

NightSiren
15-02-2018, 22:39
Ладно, спасибо за помощь, найден другой способ это сделать (занять друга на 6 часов за небольшую сумму)

megaloman
16-02-2018, 00:53
NightSiren, 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




© OSzone.net 2001-2012