Как я могу разделить строку текста в MS-ACCESS, используя SQL с текстом, датой, текстовым шаблоном? - PullRequest
0 голосов
/ 01 апреля 2019

В базе данных MS-Access у меня есть текст в одном столбце с несколькими статусами, и я хотел бы разделить их на статус и дату.«XX - текстовый текст в день месяца, год, XX - ...» является последовательным шаблоном.

Числовой XX является идентификатором статуса и может быть любыми двумя числами.Текстовый текст может иметь переменную длину, но всегда включает слово «вкл» перед указанием даты.(не в размещенном изображении, но в базе данных). Значение даты указывается в 3-х буквенном месячном 2-значном формате Day и 4-значном формате Year (например, 01 октября 2012 г.).Может быть различное количество статусов, но не более 15.

Example

1 Ответ

0 голосов
/ 02 апреля 2019

Очень сомневаюсь, что это можно сделать только с помощью SQL.Разбор строк зависит от согласованности структуры.В этом случае:
1. количество элементов состояния меняется
2. слишком много элементов состояния для анализа с функциями Mid, Left, Right, InStr, InStrRev, Len
3. длина первой части меняется
4. Символ-разделитель (запятая) используется в другом месте в строке

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

Sub Test()
Dim x As String, aryX() As String, i As Integer
x = "01 - Text text on Jan 04, 2019,02 - Text text on Feb 04, 2019"
x = Replace(x, ", ", " ")
aryX = Split(x, ",")
For i = 0 To UBound(aryX)
    Debug.Print Left(aryX(i), InStr(aryX(i), " on") - 1)
    Debug.Print CDate(Mid(aryX(i), InStr(aryX(i), "on ") + 3))
Next
End Sub

Я предлагаю создать временную таблицу - таблица постоянная, но данные временные.Иметь достаточно полей, чтобы вместить до 15 состояний (или добавить эти поля в существующую таблицу).Откройте набор записей и переберите записи.Вместо Debug.Print запишите данные в поля.

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

...