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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Пробел в имени файла на vb6.0 (http://forum.oszone.net/showthread.php?t=323373)

blackeangel 01-02-2017 13:56 2707994

Пробел в имени файла на vb6.0
 
Всем привет.
Как разбить на колонки строку
Код:

File name 0 0 755
По пробелу?
Что делать если имя файла содержит пробел?
Сплит разобьет на 5 столбцов, а надо на 4: file name в первом столбце, а все остальное вследующих.

opel431 01-02-2017 16:39 2708051

Найти первое слово, вырезать его, а оставшуюся часть строки разбить. Похоже в VB это функции - InStr, Mid, Len.

blackeangel 01-02-2017 19:12 2708104

Цитата:

Цитата opel431 (Сообщение 2708051)
Найти первое слово, вырезать его, а оставшуюся часть строки разбить. Похоже в VB это функции - InStr, Mid, Len.

А так
Код:

system/box/book for children 0 0 644 /books/for people
Тут должно получиться 5 столбцов

greg zakharov 02-02-2017 09:53 2708239

Как и другие ЯП Васик поддерживает регулярки, ими, собственно, и бейте строку. Самая регулярка будет в данном случае выглядить примерно так:
Код:

([a-z]+\/?\s?)+|\d+

Iska 02-02-2017 21:28 2708462

Банальная функция Split(string, " "). Ах, да, Вы в курсе, не увидел зараз.

Цитата:

Цитата blackeangel
Что делать если имя файла содержит пробел? »

Самое правильное — не использовать в качестве разделителя токенов символы, могущие входить в состав самого токена.

Цитата:

Цитата blackeangel
А так »

С каких пор в именах файлов стали допустимы символы «/»?! Они используются в качестве разделителя в пути. Или Ваше:
Цитата:

Цитата blackeangel
имя файла »

следует на самом деле читать как «путь к файлу»?

В любом случае Вам следует сделать либо а) заранее позаботиться о содержимом исходной строки или б) найти методы, позволяющие однозначно судить о начале и конце каждого токена в строке. Например, для приведённых Вами вариантов воспользоваться регулярками по совету коллеги greg zakharov.

blackeangel 06-02-2017 21:36 2709524

Что то такое?
Код:

Dim re As Object, result As Object, i As Integer
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "^(.*) (\d+) (\d+) (\d+)( ?(.*))?$"
Set result = re.Execute("system/app/MetokNLP/lib/arm64/liblocSDK 2 5OEMXXX.so 0 0 644")

Однако не знаю как он отработает, если пробелов нет, например, в такой строке:

system/app/MetokNLP/lib/arm64/lib.so 0 0 644

Iska 07-02-2017 05:36 2709572

Цитата:

Цитата blackeangel
Что то такое? »

Явно нет.

Вы сначала определитесь, какие могут быть варианты, затем — по каким критериям для всех этих вариантов можно определить токены. Вот я вижу у Вас уже кучу вариантов:
Код:

File name 0 0 755
system/box/book for children 0 0 644 /books/for people
system/app/MetokNLP/lib/arm64/liblocSDK 2 5OEMXXX.so 0 0 644
system/app/MetokNLP/lib/arm64/lib.so 0 0 644

и это явно не все возможные. Я, например, совершенно не представляю, что это такое, и что там вообще может быть. Излагайте подробно, иначе толку не будет.

blackeangel 07-02-2017 19:28 2709780

Цитата:

Цитата Iska (Сообщение 2709572)
Цитата:

Цитата blackeangel
Что то такое? »

Явно нет.

Вы сначала определитесь, какие могут быть варианты, затем — по каким критериям для всех этих вариантов можно определить токены. Вот я вижу у Вас уже кучу вариантов:
Код:

File name 0 0 755
system/box/book for children 0 0 644 /books/for people
system/app/MetokNLP/lib/arm64/liblocSDK 2 5OEMXXX.so 0 0 644
system/app/MetokNLP/lib/arm64/lib.so 0 0 644

и это явно не все возможные. Я, например, совершенно не представляю, что это такое, и что там вообще может быть. Излагайте подробно, иначе толку не будет.

1й и 4й вариант это одно и то же тип - пробелы слева.
А вот только пробелы справа, что то упустил.
В общем возможные варианты:
1. Пробелы слева(относительно цифр)
2. Пробелы справа
3. Пробелы и справа и слева
4. Нет пробелов.
Ну например.

Код:

1. File name 0 0 755
3. system/box/book for children 0 0 644 /books/for people
2. system/app/MetokNLP/lib/arm64/liblocSDK.so 0 0 644 /bookmack/file for read
4. system/app/MetokNLP/lib/arm64/lib.so 0 0 644


Iska 07-02-2017 21:19 2709805

blackeangel, Вы не поймёте, что я хочу услышать.

Что собой представляет данная строка? Откуда она берётся? Каким правилам подчиняется её содержимое? Что представляет собой каждый токен этой строки? Каким может быть содержимое каждого токена? Почему в одном случае их четыре, а в другом пять?

blackeangel 08-02-2017 22:07 2710126

Цитата:

Цитата Iska (Сообщение 2709805)
blackeangel, Вы не поймёте, что я хочу услышать.

Что собой представляет данная строка? Откуда она берётся? Каким правилам подчиняется её содержимое? Что представляет собой каждый токен этой строки? Каким может быть сожержимое каждого токена? Почему в одном случае их четыре, а в другом пять?

Цитата:

Что собой представляет данная строка? Что представляет собой каждый токен этой строки?
Файл с путем, права на файл, ссылка на файл
Цитата:

Откуда она берётся?
Из текстового файла, создаваемый в процессе распаковке файла-образа
Цитата:

Каким правилам подчиняется её содержимое?
Без понятия, это андроид, юникс система, и что там и как там не в курсе
Цитата:

Каким может быть сожержимое каждого токена?
Знает только производитель
Цитата:

Почему в одном случае их четыре, а в другом пять?
Где то есть ссылка на файл, где то ее нет.

Iska 09-02-2017 08:52 2710248

Ну, тогда как-то так:
Код:

^(.+) (\d+) (\d+) (\d+)(?:| (.+))$
VB6 у меня под рукой нету, на WSH выглядит так:
Скрытый текст
Код:

Option Explicit

Dim objFSO
Dim arrContent
Dim objRegExp

Dim elem
Dim i


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

With objFSO.OpenTextFile("C:\Мои проекты\0041\0001.txt")
        arrContent = Split(.ReadAll(), vbCrLf)
        .Close
End With

Set objRegExp = WScript.CreateObject("VBScript.RegExp")

objRegExp.Pattern = "^(.+) (\d+) (\d+) (\d+)(?:| (.+))$"

For Each elem In arrContent
        WScript.Echo elem
       
        If objRegExp.Test(elem) Then
                With objRegExp.Execute(elem).Item(0).Submatches
                        For i = 0 To .Count - 1
                                WScript.Echo vbTab, i, ": [" & .Item(i) & "]"
                        Next
                End With
        End If
       
        WScript.Echo
Next

Set objRegExp = Nothing
Set objFSO = Nothing

WScript.Quit 0


Скрытый текст

Обратите внимание: поскольку Вы пишете про «андроид, юникс система» — вероятно, концы строк в файле будут в формате Unix, и тогда потребуется заменить в Split() vbCrLf на vbLf.

blackeangel 12-02-2017 15:52 2711157

Iska, классно работает, но разжуйте этот кусок
Код:

For Each elem In arrContent
        WScript.Echo elem 'вывод
       
        If objRegExp.Test(elem) Then
                With objRegExp.Execute(elem).Item(0).Submatches
                        For i = 0 To .Count - 1
                                WScript.Echo vbTab, i, ": [" & .Item(i) & "]" 'вывод
                        Next
                End With
        End If
        WScript.Echo 'вывод
Next

Особенно эти 3 строки
Код:

        If objRegExp.Test(elem) Then
                With objRegExp.Execute(elem).Item(0).Submatches
                        For i = 0 To .Count - 1

И как выводить все это не на экран, а в массив?
А VB6 портативный вот https://yadi.sk/d/5TQWB-A83DvtLx

Iska 12-02-2017 17:42 2711189

Вложений: 1
Цитата:

Цитата blackeangel
А VB6 портативный вот https://yadi.sk/d/5TQWB-A83DvtLx »

Я, пожалуй, воздержусь от такого.

Цитата:

Цитата blackeangel
И как выводить все это не на экран, а в массив? »

А зачем Вам массив? Что Вы с ним делать будете? Ладно, число токенов известно заранее — пять, но число строк-то неизвестно. И делать каждый раз Redim Preserve?! Или сначала посчитать строки, а затем определять размер массива?! Ни то, ни другое не есть хорошо и правильно. Здесь я бы использовал словарь, содержащий в качестве ключа — саму строку, а в качестве значения — коллекцию SubMatches из токенов.

Код — чтение из файла в словарь и пример работы со словарём
Код:

Option Explicit

Sub Main()
    Dim objFSO As New FileSystemObject
    Dim arrContent() As String
    Dim objRegExp As New RegExp
    Dim objTokens As New Dictionary
   
    Dim elem As Variant
    Dim i As Integer
   
    Dim strKey As Variant
    Dim strToken As Variant
   
   
    With objFSO.OpenTextFile("C:\Temp\0002\0001.txt")
        arrContent = Split(.ReadAll(), vbCrLf)
        .Close
    End With
   
    objRegExp.Pattern = "^(.+) (\d+) (\d+) (\d+)(?:| (.+))$"
   
    For Each elem In arrContent
        If objRegExp.Test(elem) Then
            With objRegExp.Execute(elem).Item(0)
                objTokens.Add elem, .Submatches
            End With
        End If
    Next elem
   
    For Each strKey In objTokens
        Debug.Print strKey
       
        For Each strToken In objTokens.Item(strKey)
            Debug.Print vbTab, i, ": [" & strToken & "]"
        Next strToken
    Next strKey
   
    Set objRegExp = Nothing
    Set objFSO = Nothing
End Sub

Картинка с демонстрацией результата работы кода

Сам проект в архиве: Файл 143409.

Iska 12-02-2017 17:50 2711192

Цитата:

Цитата blackeangel
но разжуйте этот кусок »

Код:

For Each elem In arrContent ' Для каждого элемента из массива строк…
        WScript.Echo elem
       
        If objRegExp.Test(elem) Then ' Строка подходит под заданный шаблон?
                With objRegExp.Execute(elem).Item(0).Submatches ' Наложить шаблон на строку, взять первое из совпадений, взять для него коллекцию подгрупп
                        For i = 0 To .Count - 1 ' Перебрать всю коллекцию подгрупп, от первого её элемента до последнего
                                WScript.Echo vbTab, i, ": [" & .Item(i) & "]" ' Вывести очередную подгруппу
                        Next
                End With
        End If

        WScript.Echo
Next


blackeangel 12-02-2017 18:54 2711206

Iska, количество строк тоже известно оно равно кол-ву строк прочитанного файла.А вот как записать это в массив это что то не понятное. 2 раза for? 1й по количеству строк, второй по столбцам.
Что с массивом делать буду? Ой, много чего. И так крутить и сяк вертеть и накладывать на другой.
Код:

For i = 0 To .Count - 1
For k = LBound(arrContent) to UBound(arrContent)
For l = 0 to 4
arr(k,l) = arrContent(l)
Next: Next: Next

Или как то по другому?

Iska 12-02-2017 19:38 2711213

Цитата:

Цитата blackeangel
Iska, количество строк тоже известно оно равно кол-ву строк прочитанного файла. »

blackeangel, а) заранее не известно и б) кто сказал, что все строки попадут под шаблон? Так что так.

Цитата:

Цитата blackeangel
Что с массивом делать буду? Ой, много чего. И так крутить и сяк вертеть и накладывать на другой. »

Ну, давайте, рассказывайте как обгонял, как подрезал, что и как будете с ним делать. Хотелось бы увидеть и понять преимущества использования в данном конкретном случае массива перед тем же словарём или таблицей базы данных.

Цитата:

Цитата blackeangel
Или как то по другому? »

От Вы упорный. Говорю же — нельзя заранее предсказать, сколько строк попадёт под шаблон. Да даже тупо будет где-нибудь пустая строка (например, в конце файла) — и уже отличие. Поизвращаться можно, но я хочу понять — зачем.

blackeangel 12-02-2017 20:17 2711223

Цитата:

Цитата Iska (Сообщение 2711213)
Цитата:

Цитата blackeangel
Iska, количество строк тоже известно оно равно кол-ву строк прочитанного файла. »

blackeangel, а) заранее не известно и б) кто сказал, что все строки попадут под шаблон? Так что так.

Цитата:

Цитата blackeangel
Что с массивом делать буду? Ой, много чего. И так крутить и сяк вертеть и накладывать на другой. »

Ну, давайте, рассказывайте как обгонял, как подрезал, что и как будете с ним делать. Хотелось бы увидеть и понять преимущества использования в данном конкретном случае массива перед тем же словарём или таблицей базы данных.

Цитата:

Цитата blackeangel
Или как то по другому? »

От Вы упорный. Говорю же — нельзя заранее предсказать, сколько строк попадёт под шаблон. Да даже тупо будет где-нибудь пустая строка (например, в конце файла) — и уже отличие. Поизвращаться можно, но я хочу понять — зачем.

Ну пустая строка в конце файла это не проблема - гонять цикл на одну строку меньше.
Так шаблон один, как вы говорите, универсальный, так и кладем его на файл, который читаем. В котором куча всего.

blackeangel 12-02-2017 20:25 2711229

Например, содержимое этого файла надо загнать в массив, разбить на столбцы. Ваш шаблон подо все подойдет? Вроде да. Или ошибаюсь? Я старался предусмотреть все варианты.
А что с ним делается дальше смотрите тут
https://gist.github.com/blackeangel/...239ad6898343e6

Iska 12-02-2017 20:31 2711233

Цитата:

Цитата blackeangel
А что с ним делается дальше смотрите тут »

blackeangel, словами, словами рассказывайте. Чем и как массив лучше словаря или таблицы БД.

blackeangel 12-02-2017 20:59 2711244

Цитата:

Цитата Iska (Сообщение 2711233)
Цитата:

Цитата blackeangel
А что с ним делается дальше смотрите тут »

blackeangel, словами, словами рассказывайте. Чем и как массив лучше словаря или таблицы БД.

БД вообще мне не нужна для задачи.
А словарь не катит ТК не поддерживает частичного совпадения. И самое главное - про словарь не знаю ничего, не разу им не пользовался, обходился массивами всегда.

Iska 12-02-2017 21:41 2711252

Что значит «частичное совпадение»? Поясните и проиллюстрируйте кодом.

blackeangel 12-02-2017 21:49 2711254

Цитата:

Цитата Iska (Сообщение 2711252)
Что значит «частичное совпадение»? Поясните и проиллюстрируйте кодом.

Код:

For i = 1 To UBound(Arr1, 1)
For j = 1 To UBound(Arr2, 1)
If Len(Arr2(j, 1)) > 0 Then
If InStr(1, Arr2(j, 1), Arr1(i, 1)) > 0 Then
Arr2(j, 2) = Arr1(i, 1)
End If
End If
Next j
Next i

For i = 1 To UBound(Arr3, 1)
For j = 1 To UBound(Arr2, 1)
If Len(Arr2(j, 1)) > 0 Then
If InStr(1, Arr2(j, 1), Arr3(i, 1)) > 0 Then
Arr2(j, 3) = Arr3(i, 1)
End If
End If
Next j
Next i
rn = Arr2

Например 2 массива, в одном есть перечень обозначений, во втором такой же перечень но с различными добавками на конце. Надо наложить один массив на другой, и определить есть или нет хотя бы обозначений из массива 2 в массиве 1. То есть только instr. Словарь такое может?

ПС вы даже не сходили по ссылке и не глянули что например в массиве я потом делю на файлы и папки те строки. Словарь это тоже не может. Ну и зачем инструмент который не может того что мне нужно? Да, он быстрый, но не гибкий.

Iska 12-02-2017 22:32 2711264

blackeangel, «проиллюстрируйте кодом» подразумевает код, который можно исполнить и увидеть результат. То есть, готовый пример. Каково содержимое Arr1, Arr2 и Arr3?

Цитата:

Цитата blackeangel
ПС вы даже не сходили по ссылке и не глянули »

Я ходил и глядел. У меня нет большого желания сидеть и детально разбираться в портянке плохо структурированного кода. Смотрю на него — и будто во времена Fortran-IV вернулся. Я про то и говорю, что Вы зарылись в эти массивы, и не делаете ни шага влево, ни шага вправо, хотя есть ещё целая куча объектов, но Вы их не используете.

Цитата:

Цитата blackeangel
например в массиве я потом делю на файлы и папки те строки. Словарь это тоже не может. »

Может, может ;).


Цитата:

Цитата blackeangel
Ваш шаблон подо все подойдет? Вроде да. Или ошибаюсь? »

Прогнал по шаблону — совпали все строки.

P.S. Добавлю ещё про массивы: у Вас куча кода уходит попросту на борьбу с недостатками многомерных массивов.

blackeangel 13-02-2017 06:54 2711323

Цитата:

Цитата Iska (Сообщение 2711264)
Может, может ;).

Ну ка ну ка, а то вдруг откажусь сегодня ж от массивов?
Цитата:

Цитата Iska (Сообщение 2711264)
P.S. Добавлю ещё про массивы: у Вас куча кода уходит попросту на борьбу с недостатками многомерных массивов.

Количество строк мне не мешает ;)
Ну ка что там за борьба с коррупцией?

И вообще, мы ушли от обсуждаемой темы. И занялись моим говнокодом, который даже еще не дописан и не оптимизирован.

blackeangel 14-02-2017 21:36 2711790

Iska, трудно было подсказать?
Вот так работает в массив
Код:

Private Sub Command1_Click()
Dim objFSO
Dim arrContent
Dim objRegExp

Dim elem
Dim i


Set objFSO = CreateObject("Scripting.FileSystemObject")

With objFSO.OpenTextFile("C:\system_statfile.txt")
    arrContent = Split(.ReadAll(), vbCrLf)
    .Close
End With
ReDim arr(UBound(arrContent), 4)
Set objRegExp = CreateObject("VBScript.RegExp")

objRegExp.Pattern = "^(.+) (\d+) (\d+) (\d+)(?:| (.+))$"
'
    For Each elem In arrContent
        If objRegExp.Test(elem) Then
        With objRegExp.Execute(elem).Item(0).Submatches
            For i = 0 To .Count - 1
                        arr(j, i) = .Item(i)
            Next
            j = j + 1
        End With
    End If
Next
End Sub


Iska 15-02-2017 15:34 2711975

blackeangel, подсказать мне не трудно. Но Вы должны отчётливо понимать две вещи:
  1. Размещать, а затем удалять свои сообщения, имеющие существенное отношение к теме, не есть красиво и правильно.
  2. Iska не сидит в ожидании вопроса на конференции днями и ночами для немедленного обслуживания клиентов пользователей, он обычный человек со своими потребностями и обязанностями.

blackeangel 18-02-2017 21:09 2712883

Цитата:

Цитата Iska (Сообщение 2711975)
blackeangel, подсказать мне не трудно.

В чем же тогда было дело? Зачем надо было настаивать на том что не нужно?
В прочем, этот форум не для выяснения отношений.

А теперь о погоде.
Как теперь наступила пора подобрать другой шаблон разбивающий на 2 столбца например, такое
Код:

/system/children mad u:object_r:childrens mad
Где разделитель на столбцы может быть одним, двумя, тремя ... n пробелами. Вторая часть всегда начинается с
Код:

u:object_r:
Что надо менять уже в имеющемся шаблоне?

Iska 19-02-2017 01:28 2712950

Цитата:

Цитата blackeangel
В чем же тогда было дело? »

Я же написал — в чём. В предыдущем собщении.


Цитата:

Цитата blackeangel
Что надо менять уже в имеющемся шаблоне? »

Как-то так (не проверялось):
Код:

^(.+) +(u:object_r:.*)$
Ну, и подгрупп будет, соответственно, две.

Если не сработает, попробуйте заэкранировать часть шаблона так: «u\:object_r\:». Не помню, надо ли экранировать двоеточие, або нет.

blackeangel 19-02-2017 22:16 2713164

Iska, все хорошо, только он оставляет пробелы в конце 1го столбца, а этого не надо бы....
в переменных типа такого проскакивает
Код:

"/system/bin/mcd          "
а хотелось бы чтобы разбивал правильно
Код:

"/system/bin/mcd"

Iska 19-02-2017 23:27 2713179

Цитата:

Цитата blackeangel
Iska, все хорошо, только он оставляет пробелы в конце 1го столбца, а этого не надо бы.... »

Вот что значит — не проверять. Попробуйте так (и опять не проверялось :)):
Код:

^(.+?) +(u:object_r:.*)$

blackeangel 20-02-2017 14:38 2713326

Цитата:

Цитата Iska (Сообщение 2713179)
Цитата:

Цитата blackeangel
Iska, все хорошо, только он оставляет пробелы в конце 1го столбца, а этого не надо бы.... »

Вот что значит — не проверять. Попробуйте так (и опять не проверялось :)):
Код:

^(.+?) +(u:object_r:.*)$

Отлично сработало, спасибо.
А вот если есть пробелы в конце строки, то можно шаблон расширить для этого? Или все таки лучше заменами?

Iska 20-02-2017 15:28 2713350

Цитата:

Цитата blackeangel
А вот если есть пробелы в конце строки, »

Например? Так:
Код:

/system/children    mad____u:object_r:childrens mad_____
скажем?!

Тогда можно попробовать так:
Код:

^(.+?) +(u:object_r:.*?) *$
Update: Ну, вот, опять: концевые пробелы в тэге code движок хранит, но не отображает. Поменял пробелы на подчёркивания.

blackeangel 20-02-2017 16:17 2713363

Цитата:

Цитата Iska (Сообщение 2713350)
Цитата:

Цитата blackeangel
А вот если есть пробелы в конце строки, »

Например? Так:
Код:

/system/children    mad____u:object_r:childrens mad_____
скажем?!

Тогда можно попробовать так:
Код:

^(.+?) +(u:object_r:.*?) *$
Update: Ну, вот, опять: концевые пробелы в тэге code движок хранит, но не отображает. Поменял пробелы на подчёркивания.

Не, не прокатывает, тоже уже попробовал. :(

Iska 20-02-2017 16:26 2713370

Цитата:

Цитата blackeangel
Не, не прокатывает, тоже уже попробовал. »

А у меня прокатывает:
Пример кода
Код:

Option Explicit

Dim strString


strString =  "/system/children    mad    u:object_r:childrens mad    "

With WScript.CreateObject("VBScript.RegExp")
        .Pattern = "^(.+?) +(u:object_r:.*?) *$"
       
        If .Test(strString) Then
                With .Execute(strString).Item(0).Submatches
                        WScript.Echo "[" & .Item(0) & "]"
                        WScript.Echo "[" & .Item(1) & "]"
                End With
        End If
End With

WScript.Quit 0


Результат
Код:

[/system/children    mad]
[u:object_r:childrens mad]


Если у Вас не так — выкладывайте образец исходного файла, упакованный в архив.

blackeangel 20-02-2017 18:30 2713408

Iska, странно, так же пробовал и по нулям. Вот файле.

Iska 20-02-2017 19:26 2713427

А где там, простите, пробелы между именами и «u:object_r:», ась? Я лично вижу там малоудобоваримую мешанину из символов табуляции, пробелов и дефисов:
Скрытый текст

Каким образом Вы получаете данный файл?

P.S. Попробуйте такой шаблон:
Код:

^(.+?)[ \t-]+(u:object_r:.*?) *$

blackeangel 20-02-2017 19:49 2713436

Iska, между именами в этом файле нет, но есть в конце строк.
Дефисы двойные и табы заменяются на пробелы.
Опять же, его делает производитель прошивок.

Iska 20-02-2017 20:02 2713443

blackeangel, я работаю с тем файлом, который Вы выкладываете, не строя каких-то иных предположений. У меня шаблон, показанный в сообщении #36, корректно разбирает строки выложенного Вами файла на две подгруппы. А у Вас?

blackeangel 20-02-2017 21:51 2713489

Iska, а у меня нет, пробелы в конце остаются, смотрите скриншоты
и, думаю вместо
Код:

[ \t-]
надо использовать
Код:

[\s-]

Iska 20-02-2017 23:04 2713524

Не подтверждаю.
Вот код
Код:

Option Explicit

Sub Main()
    Dim objFSO As New FileSystemObject
    Dim arrContent() As String
    Dim objRegExp As New RegExp
    Dim objTokens As New Dictionary
   
    Dim strString As Variant
   
   
    With objFSO.OpenTextFile("\\tsclient\C\Мои проекты\0046\file_contexts")
        arrContent = Split(.ReadAll(), vbLf)
        .Close
    End With
   
    objRegExp.Pattern = "^(.+?)[ \t-]+(u:object_r:.*?) *$"
   
    For Each strString In arrContent
        Debug.Print strString
       
        If objRegExp.Test(strString) Then
            With objRegExp.Execute(strString).Item(0).SubMatches
                Debug.Print "[" & .Item(0) & "]"
                Debug.Print "[" & .Item(1) & "]"
            End With
        End If
       
        Debug.Print
    Next
   
    Set objRegExp = Nothing
    Set objFSO = Nothing
End Sub

Выжимки из вывода
Код:

/system/bin/logcat  --  u:object_r:logcat_exec:s0     
[/system/bin/logcat]
[u:object_r:logcat_exec:s0]

/system/bin/sh          --  u:object_r:shell_exec:s0             
[/system/bin/sh]
[u:object_r:shell_exec:s0]

/system/bin/run-as  --  u:object_r:runas_exec:s0
[/system/bin/run-as]
[u:object_r:runas_exec:s0]

Вот скриншот


Цитата:

Цитата blackeangel
и, думаю вместо [ \t-] надо использовать [\s-] »

Не вижу принципиальной необходимости.

blackeangel 21-02-2017 00:16 2713549

Iska, посмотрите что получилось в этих строках
Код:

/system(/.*)?                u:object_r:system_file:s0             
/system/bin/e2fsck        --        u:object_r:fsck_exec:s0

Думаю в них так же пробелы будут. Ну не может один и тот же код, работать по разному на 3х компах.

Iska 21-02-2017 00:50 2713553

Поменял вывод групп в одну строку, на:
Код:

Debug.Print "[" & .Item(0) & "]" & vbTab & "[" & .Item(1) & "]"
дабы умещалось в окне Immediate. Результат (начало вывода):
Код:

/system(/.*)?      u:object_r:system_file:s0             
[/system(/.*)?] [u:object_r:system_file:s0]

/system/bin/e2fsck  --  u:object_r:fsck_exec:s0           
[/system/bin/e2fsck]    [u:object_r:fsck_exec:s0]

/system/bin/fsck\.f2fs  --  u:object_r:fsck_exec:s0
[/system/bin/fsck\.f2fs]    [u:object_r:fsck_exec:s0]

/system/bin/fsck_msdos  --  u:object_r:fsck_exec:s0
[/system/bin/fsck_msdos]    [u:object_r:fsck_exec:s0]


Показывайте Ваш код (можете весь проект упаковать в архив и выложить).

blackeangel 21-02-2017 05:49 2713571

Iska,
Код:

'file_contexts
file_contexts = CreateObject("Scripting.FileSystemObject").OpenTextFile(App.Path & "\file_contexts", 1).ReadAll
file_contexts = Replace(file_contexts, "  " & vbLf, vbCrLf)
file_contexts = Replace(file_contexts, " " & vbLf, vbCrLf)
file_contexts = Replace(file_contexts, vbTab & vbTab & vbLf, vbCrLf)
file_contexts = Replace(file_contexts, vbTab & vbLf, vbCrLf)
file_contexts = Replace(file_contexts, vbLf, vbCrLf)
'file_contexts = Replace(file_contexts, vbTab, " ")
'file_contexts = Replace(file_contexts, "--", "")
'file_contexts = Replace(file_contexts, "      ", " ")
'file_contexts = Replace(file_contexts, "      ", " ")
'file_contexts = Replace(file_contexts, "    ", " ")
'file_contexts = Replace(file_contexts, "    ", " ")
'file_contexts = Replace(file_contexts, "  ", " ")
'file_contexts = Replace(file_contexts, "  ", " ")
file_contexts = Replace(file_contexts, vbCrLf & vbCrLf, vbCrLf)
'разбиваем на строки
contexts = Split(file_contexts, vbCrLf)
'бьем на столбцы
ReDim arr5(UBound(contexts), 1)
'For i = LBound(contexts) To UBound(contexts)
'    If InStr(1, contexts(i), "#") = 0 Then
'    If InStr(1, contexts(i), "/system/") > 0 Then 'Or InStr(1, contexts(i), "/vendor/") > 0 Then 'âûáèðàåì òîëüêî ïàïêó system è vendor
'          arr = Split(contexts(i))
'        For j = LBound(arr) To UBound(arr)
'            arr5(i, j) = arr(j)
'        Next
'      End If
'    End If
'Next
'через регулярки
Set objRegExp = CreateObject("VBScript.RegExp")
'objRegExp.Pattern = "^(.*) +(u:object_r:.+)$"
'objRegExp.Pattern = "^(.*?) +(u:object_r:.+) *$"
objRegExp.Pattern = "^(.+?)[\s-]+(u:object_r:.*?) *$"
    For Each elem In contexts
    If InStr(1, elem, "/system/") > 0 Then
        If objRegExp.Test(elem) Then
        With objRegExp.Execute(elem).Item(0).Submatches
            For i = 0 To .Count - 1
                        arr5(j, i) = .Item(i)
            Next
            j = j + 1
        End With
  End If
 End If
Next

Erase contexts
contexts = DeleteBlankRows(arr5, 1) 'удаляем пустые строки по 2 столбцу
Erase arr5


blackeangel 21-02-2017 09:02 2713591

Iska, проблема решилась удалением всех строк с replace.
Спасибо.

Iska 21-02-2017 12:22 2713682

Цитата:

Цитата blackeangel
… replace. »

Я подозревал что-то вроде этого.


Время: 00:51.

Время: 00:51.
© OSzone.net 2001-