Войти

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


Страниц : [1] 2 3

blackeangel
01-02-2017, 13:56
Всем привет.
Как разбить на колонки строку

File name 0 0 755

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

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

blackeangel
01-02-2017, 19:12
Найти первое слово, вырезать его, а оставшуюся часть строки разбить. Похоже в VB это функции - InStr, Mid, Len.
А так
system/box/book for children 0 0 644 /books/for people

Тут должно получиться 5 столбцов

greg zakharov
02-02-2017, 09:53
Как и другие ЯП Васик поддерживает регулярки, ими, собственно, и бейте строку. Самая регулярка будет в данном случае выглядить примерно так:
([a-z]+\/?\s?)+|\d+

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

Что делать если имя файла содержит пробел? »
Самое правильное — не использовать в качестве разделителя токенов символы, могущие входить в состав самого токена.

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

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

blackeangel
06-02-2017, 21:36
Что то такое?

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
Что то такое? »
Явно нет.

Вы сначала определитесь, какие могут быть варианты, затем — по каким критериям для всех этих вариантов можно определить токены. Вот я вижу у Вас уже кучу вариантов:
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
Что то такое? »
Явно нет.

Вы сначала определитесь, какие могут быть варианты, затем — по каким критериям для всех этих вариантов можно определить токены. Вот я вижу у Вас уже кучу вариантов:
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
blackeangel, Вы не поймёте, что я хочу услышать.

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

blackeangel
08-02-2017, 22:07
blackeangel, Вы не поймёте, что я хочу услышать.

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

Что собой представляет данная строка? Что представляет собой каждый токен этой строки?

Файл с путем, права на файл, ссылка на файл

Откуда она берётся?

Из текстового файла, создаваемый в процессе распаковке файла-образа

Каким правилам подчиняется её содержимое?

Без понятия, это андроид, юникс система, и что там и как там не в курсе

Каким может быть сожержимое каждого токена?

Знает только производитель

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

Где то есть ссылка на файл, где то ее нет.

Iska
09-02-2017, 08:52
Ну, тогда как-то так:
^(.+) (\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

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

blackeangel
12-02-2017, 15:52
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
А VB6 портативный вот https://yadi.sk/d/5TQWB-A83DvtLx »
Я, пожалуй, воздержусь от такого.

И как выводить все это не на экран, а в массив? »
А зачем Вам массив? Что Вы с ним делать будете? Ладно, число токенов известно заранее — пять, но число строк-то неизвестно. И делать каждый раз 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
http://i.imgur.com/IZ8v3HX.png
Сам проект в архиве: 143409.

Iska
12-02-2017, 17:50
но разжуйте этот кусок »
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
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
Iska, количество строк тоже известно оно равно кол-ву строк прочитанного файла. »
blackeangel, а) заранее не известно и б) кто сказал, что все строки попадут под шаблон? Так что так.

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

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

blackeangel
12-02-2017, 20:17
Iska, количество строк тоже известно оно равно кол-ву строк прочитанного файла. »
blackeangel, а) заранее не известно и б) кто сказал, что все строки попадут под шаблон? Так что так.

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

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

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

Iska
12-02-2017, 20:31
А что с ним делается дальше смотрите тут »
blackeangel, словами, словами рассказывайте. Чем и как массив лучше словаря или таблицы БД.

blackeangel
12-02-2017, 20:59
А что с ним делается дальше смотрите тут »
blackeangel, словами, словами рассказывайте. Чем и как массив лучше словаря или таблицы БД.
БД вообще мне не нужна для задачи.
А словарь не катит ТК не поддерживает частичного совпадения. И самое главное - про словарь не знаю ничего, не разу им не пользовался, обходился массивами всегда.




© OSzone.net 2001-2012