|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] [VBS] Сортировка текстовых строк с учётом директорий |
|
|
VBS/WSH/JS - [решено] [VBS] Сортировка текстовых строк с учётом директорий
|
|
Старожил Сообщения: 268 |
Есть текстовые строки (именно строки, а не пути к существующим файлам)
\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 |
|
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать shadowbat, в списке только один символ (f или F) и он одинаковый во всех строках , или вместо него может быть смесь символов перед цифрами и они могут в разных строках свои?
|
|
------- Отправлено: 14:54, 05-01-2020 | #2 |
|
Старожил Сообщения: 268
|
Профиль | Отправить 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 |
|
Ветеран Сообщения: 2735
|
Профиль | Отправить 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 |
|
Старожил Сообщения: 268
|
Профиль | Отправить 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 |
|
Старожил Сообщения: 268
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
|
Отправлено: 02:48, 06-01-2020 | #7 |
|
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать shadowbat, спасибо, ясно.
|
|
Отправлено: 03:12, 06-01-2020 | #8 |
|
Старожил Сообщения: 268
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
подразумевается, что изначально в строках не было разнорегистровых дублей, иначе оба дубля получат одинаковый регистр (либо нижний либо изначальный) исправил лишнее добавление пустой строки в конце нового файла добавить после MsgBox out: и сохранение в файл соответственно заменить на out3 |
|
|
Последний раз редактировалось shadowbat, 06-01-2020 в 04:04. Отправлено: 03:52, 06-01-2020 | #9 |
|
Ветеран Сообщения: 2735
|
Профиль | Отправить 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 | |
|