|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] [VBS] Сортировка текстовых строк с учётом директорий |
|
VBS/WSH/JS - [решено] [VBS] Сортировка текстовых строк с учётом директорий
|
Старожил Сообщения: 267 |
Есть текстовые строки (именно строки, а не пути к существующим файлам)
\F1\1.txt \F111\2.txt \f11.txt \f33.txt \f22.txt \F0\3.txt \F0\1.txt \F0\2\2.txt \F1\ \F0\ \F0\2\ \F111\ \F0\ \F0\1.txt \F0\2\ \F0\2\2.txt \F0\3.txt \f11.txt \F111\ \F111\2.txt \F1\ \F1\1.txt \f22.txt \f33.txt \f11.txt \f22.txt \f33.txt \F0\ \F0\1.txt \F0\3.txt \F0\2\ \F0\2\2.txt \F1\ \F1\1.txt \F111\ \F111\2.txt \F0\ \F0\2\ \F0\2\2.txt \F0\1.txt \F0\3.txt \F1\ \F1\1.txt \F111\ \F111\2.txt \f11.txt \f22.txt \f33.txt Как это сделать? есть решение или алгоритм? это должна быть рекурсивная функция? через split("\") ? |
|
Отправлено: 14:03, 05-01-2020 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать shadowbat, в списке только один символ (f или F) и он одинаковый во всех строках , или вместо него может быть смесь символов перед цифрами и они могут в разных строках свои?
|
------- Отправлено: 14:54, 05-01-2020 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 267
|
Профиль | Отправить PM | Цитировать Цитата:
это парсинг реальных путей файлов, но в виде строк, соответственно имена могут быть такие же как у реальных директорий и файлов - самые различные сам пока пишу на split() и ubound(split()) очень предварительный и полуправильный вариант
Sub Sort() Dim a(): ReDim a(1 To 12) a(1) = "\F1\1.txt" a(2) = "\F111\2.txt" a(3) = "\f11.txt" a(4) = "\f33.txt" a(5) = "\f22.txt" a(6) = "\F0\3.txt" a(7) = "\F0\1.txt" a(8) = "\F0\2\2.txt" a(9) = "\F1\" a(10) = "\F0\" a(11) = "\F0\2\" a(12) = "\F111\" 'сортировка a(1) = "\F0\" a(2) = "\F0\1.txt" a(3) = "\F0\2\" a(4) = "\F0\2\2.txt" a(5) = "\F0\3.txt" a(6) = "\f11.txt" a(7) = "\F111\" a(8) = "\F111\2.txt" a(9) = "\F1\" a(10) = "\F1\1.txt" a(11) = "\f22.txt" a(12) = "\f33.txt" For Each aa In a kol = UBound(Split(aa, "\")): If kol > max Then max = kol Next aa Call Sort1(a, 0, max) Stop End Sub Sub Sort1(a, l, max) For Each aa In a kol = UBound(Split(aa, "\")) If kol = l Then Debug.Print aa Next aa If l <= max Then Call Sort1(a, l + 1, max) End Sub |
|
Последний раз редактировалось shadowbat, 05-01-2020 в 16:16. Отправлено: 15:08, 05-01-2020 | #3 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать не по алфавиту, а по директориям
FileIn = "Z:\Box_In\filein.txt" FileOut = "Z:\Box_Out\fileout.txt" Set FSO = CreateObject("Scripting.FileSystemObject") On Error Resume Next With FSO.OpenTextFile(FileIn, 1, False) If Err.Number <> 0 Then MsgBox "File " + FileIn + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")" WScript.Quit 2 End If On Error GoTo 0 Alls = Split(.ReadAll, vbCrLf) .Close End With N = -1 ND = -1 NF = -1 For Each s In Alls N = N + 1 s = Trim(s) Alls(N) = s If Len(s) <> 0 Then If Right(s, 1) = "\" Then ND = ND + 1 Else NF = NF + 1 End If Next ReDim MasD(ND), MasF(NF) jD = -1 jF = -1 For i = 0 To N s = Alls(i) If Len(s) <> 0 Then If Right(s, 1) = "\" Then jD = jD + 1 MasD(jD) = Replace(LCase(Alls(i)), "\", Chr(0)) Else jF = jF + 1 MasF(jF) = Replace(LCase(Alls(i)), "\", Chr(0)) End If End If Next Set Alls = Nothing For i = 0 To ND For j = i To ND If MasD(i) < MasD(j) Then s = MasD(i) MasD(i) = MasD(j) MasD(j) = s End If Next Next For i = 0 To NF For j = i To NF If MasF(i) < MasF(j) Then s = MasF(i) MasF(i) = MasF(j) MasF(j) = s End If Next Next out = "" For i = 0 To ND D = MasD(i) For j = 0 To NF If InStr(1, MasF(j), D) <> 0 Then out = MasF(j) + vbCrLf + out MasF(j) = "" End If Next out = D + vbCrLf + out Next For j = 0 To NF If MasF(j) <> "" Then out = MasF(j) + vbCrLf + out Next out = Replace(out, Chr(0), "\") 'MsgBox out ''''''''''''''''''''''' With FSO.CreateTextFile(FileOut, True) .Write out .Close End With MsgBox "Done" |
------- Последний раз редактировалось megaloman, 05-01-2020 в 21:31. Отправлено: 21:12, 05-01-2020 | #4 |
Старожил Сообщения: 267
|
Профиль | Отправить PM | Цитировать megaloman, работает
замена "\" на Chr(0) изящная, действительно AscW("\") мешает сравнивать строки, т.к. у него номер ниже/выше чем у алфавита а также выдаёт все строки в LCase регистре, что всё-таки является изменением, а не только сортировкой (понимаю, что без LCase сортировка в текущем виде не сработает, но факт остается фактом - после этой функции нужно производить дальнейшие действия со строками только в нижнем регистре, либо дополнительно восстанавливать изначальный регистр после функции) |
|
Последний раз редактировалось shadowbat, 06-01-2020 в 04:07. Отправлено: 22:31, 05-01-2020 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать shadowbat, а можете рассказать, для чего Вам потребен список именно в таком виде?
|
Отправлено: 01:43, 06-01-2020 | #6 |
Старожил Сообщения: 267
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 02:48, 06-01-2020 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать shadowbat, спасибо, ясно.
|
Отправлено: 03:12, 06-01-2020 | #8 |
Старожил Сообщения: 267
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
подразумевается, что изначально в строках не было разнорегистровых дублей, иначе оба дубля получат одинаковый регистр (либо нижний либо изначальный) исправил лишнее добавление пустой строки в конце нового файла добавить после MsgBox out: и сохранение в файл соответственно заменить на out3 |
|
Последний раз редактировалось shadowbat, 06-01-2020 в 04:04. Отправлено: 03:52, 06-01-2020 | #9 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Цитата shadowbat:
Вариант, где этого делать не надо. Не думал, что регистр в путях имеет какое-то значение
FileIn = "Z:\Box_In\filein.txt" FileOut = "Z:\Box_Out\fileout.txt" Set FSO = CreateObject("Scripting.FileSystemObject") On Error Resume Next With FSO.OpenTextFile(FileIn, 1, False) If Err.Number <> 0 Then MsgBox "File " + FileIn + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")" WScript.Quit 2 End If On Error GoTo 0 Alls = Split(.ReadAll, vbCrLf) .Close End With N = -1 ND = -1 NF = -1 For Each s In Alls N = N + 1 s = Trim(s) Alls(N) = s If Len(s) <> 0 Then If Right(s, 1) = "\" Then ND = ND + 1 Else NF = NF + 1 End If Next ReDim MasD(ND), MasF(NF) jD = -1 jF = -1 For i = 0 To N s = Alls(i) If Len(s) <> 0 Then If Right(s, 1) = "\" Then jD = jD + 1 MasD(jD) = Replace(Alls(i), "\", Chr(0)) Else jF = jF + 1 MasF(jF) = Replace(Alls(i), "\", Chr(0)) End If End If Next Set Alls = Nothing Call SortMas(MasD, ND) Call SortMas(MasF, NF) out = "" For i = 0 To ND D = LCase(MasD(i)) For j = 0 To NF If InStr(1, LCase(MasF(j)), D) <> 0 Then If out = "" Then out = MasF(j) Else out = MasF(j) + vbCrLf + out MasF(j) = "" End If Next If out = "" Then out = MasD(i) Else out = MasD(i) + vbCrLf + out Next For j = 0 To NF If MasF(j) <> "" Then out = MasF(j) + vbCrLf + out Next out = Replace(out, Chr(0), "\") 'MsgBox out ''''''''''''''''''''''' With FSO.CreateTextFile(FileOut, True) .Write out .Close End With MsgBox "Done" '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''End Sub SortMas(Mas, NMas) For i = 0 To NMas s = LCase(Mas(i)) For j = i To NMas ss = LCase(Mas(j)) If s < ss Then s = Mas(i) Mas(i) = Mas(j) Mas(j) = s s = LCase(Mas(i)) End If Next Next End Sub |
|
------- Последний раз редактировалось megaloman, 06-01-2020 в 15:22. Причина: Исправление недоёта при сравнении разнорегистровых строк Отправлено: 09:45, 06-01-2020 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Любой язык - [решено] Сравнение 2-х текстовых файлов и удаление дубликатов строк в 1-м файле. | Uragan66 | Скриптовые языки администрирования Windows | 2 | 26-05-2019 16:14 | |
Самостоятельно меняется первый символ строк в текстовых файлах (и другие проблемы) | lesnoj | Лечение систем от вредоносных программ | 4 | 11-11-2015 08:42 | |
CMD/BAT - [решено] удаление части строк из всех текстовых файлов в папке | icq99999999 | Скриптовые языки администрирования Windows | 4 | 06-11-2013 07:19 | |
Java - Сортировка строк по первому слову в алфавитном порядке | pogo | Программирование и базы данных | 5 | 23-12-2011 08:05 | |
Сортировщик строк в текстовых файлах. | borison | Программное обеспечение Windows | 2 | 04-02-2007 10:22 |
|