powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Разбить строку на несколько строк
5 сообщений из 5, страница 1 из 1
Разбить строку на несколько строк
    #35357643
Доброго времени суток всем!
Кто сможет помочь? Есть у меня в таблице 1 поле MEMO. В нём через разделители Chr(13) & Chr(10) записаны следующие строки:

-------------------------
Title: ###
First Name: #######
Last Name: #######
Suffix: #######
Job Title: ##
Company: ######### #######
Street: ########
City: #########
-------------------------

Заголовки строк повторяются - в каждой записи присутствуют идентичные Title, First Name и т.д.; строки разделены стандартной последовательностью Chr(13);Chr(10). Можно ли как-то "разбить" это одно поле MEMO на части - то есть в запросе получить таблицу, содержащую не одно поле MEMO, а 8 текстовых полей? Заранее спасибо!
...
Рейтинг: 0 / 0
Разбить строку на несколько строк
    #35357668
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно функцию написать, в которую передавать значение мемо-поля и номер строки в ней, которую надо получить. В функции при помощи Split получать массив и возвращать нужный элемент. А в запросе написать 8 вызовов этой функции - по числу элементов в мемо-значении.
...
Рейтинг: 0 / 0
Разбить строку на несколько строк
    #35357699
Karfagen, спасибо! Я по этому пути идти и собирался. Но не совсем понимаю, как мне лучше разделять строки. Нашёл и попробовал что-то типа этого:


'============================================================================='Функция возвращает массив элементов из строки, разделенных разделителем
'=============================================================================
Public Function Разбор_строки_в_массив(Строка As String, Разделитель As String) As Variant

Dim МассивСлов() As Variant
Dim i As Integer
Dim k As Integer 'счетчик элементов массива
Dim j As Integer 'начальная позиция слова в строке
Dim КоличествоСлов As Integer
Dim ПозицияНайденногоСлова As Integer
Dim Str As String

k = 1
j = 1
ПозицияНайденногоСлова = 0

'подсчет кол-ва слов в строке
КоличествоСлов = Число_слов_в_строке(Строка, Разделитель)


'Если строка состоит из 1 слова
If КоличествоСлов = 1 Then
'Выйти из функции с соответствующим значением
Разбор_строки_в_массив = Строка
Exit Function
ElseIf КоличествоСлов = 0 Then
Разбор_строки_в_массив = Null
Exit Function
End If

'создание соответствующей размерности в массивах
ReDim МассивСлов(1 To КоличествоСлов)

'Цикл по символам в строке
For i = 1 To Len(Строка) - Len(Разделитель) + 1
If Mid(Строка, i, Len(Разделитель)) = Разделитель Then
'Занести в массив слово
МассивСлов(k) = Mid(Строка, j, i - j)
k = k + 1
j = i + Len(Разделитель)
End If
Next i

'Занесение последнего слова
МассивСлов(k) = Mid(Строка, j, i - j + Len(Разделитель) - 1)

'Возврат значения
Разбор_строки_в_массив = МассивСлов

End Function


Массив не всегда одинаковый, вот в чем проблема. Встречаются строки, где юзеры втулили пару лишних "энтеров", и на этом я стопорюсь...
...
Рейтинг: 0 / 0
Разбить строку на несколько строк
    #35357927
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blue Screen of DeathНо не совсем понимаю, как мне лучше разделять строки. Нашёл и попробовал что-то типа этогоЕсли у вас Access старше msa97, то для этих дел есть функция Split. С ее помощью приведенный вами фрагмент записывается одной строкой.

Однако, учитывая ваше позднее замечание насчет возможных лишних Chr(13)+Chr(10) в мемо-значении, возможно есть смысл использовать несколько иной подход - не разбивать строку в массив и получать элемент по запрошенному индексу (как я ранее предлагал), а искать в мемо-строке указанный префикс и возвращать подстроку от него до ближайшего перевода строки.

Пример функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function GetMidStr(src$, zfrom$) As String
'получить из <src>строки подстроку между <zfrom> и следующим vbCrLf(либо до конца)
On Error Resume Next
    Dim i&, j&, k&
    k = Len(zfrom)
    i = InStr( 1 , src, zfrom): If i =  0  Then Exit Function
    j = InStr(i + k, src, vbCrLf): If j =  0  Then j = Len(src) +  1 
    GetMidStr = Mid(src, i + k, j - i - k)
End Function

Пример запроса с ее использованием:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT 
GetMidStr([МемоПоле],"Title: ") AS [Title],
GetMidStr([МемоПоле],"First Name: ") AS [First Name],
GetMidStr([МемоПоле],"Last Name: ") AS [Last Name],
GetMidStr([МемоПоле],"Suffix: ") AS [Suffix],
GetMidStr([МемоПоле],"Job Title: ") AS [Job Title],
GetMidStr([МемоПоле],"Company: ") AS [Company],
GetMidStr([МемоПоле],"Street: ") AS [Street],
GetMidStr([МемоПоле],"City: ") AS [City]
FROM [ИмяТаблицы]
При таком подходе не только лишние CrLf не помешают, но и даже порядок этих субстрок в мемо-значении может быть любым.

Пробуйте.
...
Рейтинг: 0 / 0
Разбить строку на несколько строк
    #35357978
Karfaqen, большое Вам спасибо, всё получается именно как надо!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Разбить строку на несколько строк
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]