Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35

Обработка строк в каталогах картин

16.03.2019, 12:58. Показов 1324. Ответов 4

Студворк — интернет-сервис помощи студентам
Мне частенько приходиться обрабатывать текстовые файлы с кучей строк такого вида:
Слава Богу понемногу научились по Ван Гогу (2014; холст, масло; 45х72)
Цветочки (1997; картон, масло; 57x47)
Хрень зелёная (2011; холст, масло; 60х48.5)

Чтобы было понятно: сначала название картины, а в скобочках - дата написания; техника; размер в сантиметрах высота на ширину.

Проблема в том, что символом между цифрами должна быть латинская буква "x" обязательно в нижнем регистре (для единообразия), а мне присылают то с русской буквой "Х" или "х", то с латинской "X".

Чтобы не мучиться вручную, написал программу X00.
Исходник:
X00 01.zip

Анализ и обработку строки делает одна функция:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Function sArtX(ByVal sL As String) As String
  ' sArtX - поиск в строке "Х" и "х" и замена на латинское "x".
  Dim sT As String
  Dim sNum As String
  Dim sCB As String
  Dim sCE As String
  Dim lLen As Long
  Dim lPos As Long
  Dim lStart As Long
  '
  If "" = sL Then
    ' Пустая строка - искать нечего.
    sArtX = ""
    Exit Function
  End If
  sT = LCase$(sL)
  If 0 = InStr(sT, "х") And 0 = InStr(sT, "x") Then
    ' Символы "Х" и "х" в строке не обнаружен.
    sArtX = sL
    Exit Function
  End If
  sNum = "0123456789"
  sT = sL
  lLen = Len(sT)
  lStart = 1
  Do While True
    ' Замена латинской буквы X
    lPos = InStr(lStart, sT, "X")
    If 0 = lPos Then
      Exit Do
    ElseIf 1 = lPos Then
      ' Первая позиция - анализировать нечего - начинаем поиск со следующего символа
      lStart = lPos + 1
    ElseIf lLen = lPos Then
      ' Последняя позиция - анализировать нечего - выходим из цикла
      Exit Do
    Else
      sCB = Mid$(sT, lPos - 1, 1)
      sCE = Mid$(sT, lPos + 1, 1)
      If 0 <> InStr(sNum, sCB) And 0 <> InStr(sNum, sCE) Then
        Mid$(sT, lPos) = "x"
        lStart = lPos + 1
      Else
        lStart = lPos + 1
      End If
    End If
  Loop
  lStart = 1
  Do While True
    ' Замена русской буквы Х
    lPos = InStr(lStart, sT, "Х")
    If 0 = lPos Then
      Exit Do
    ElseIf 1 = lPos Then
      ' Первая позиция - анализировать нечего - начинаем поиск со следующего символа
      lStart = lPos + 1
    ElseIf lLen = lPos Then
      ' Последняя позиция - анализировать нечего - выходим из цикла
      Exit Do
    Else
      sCB = Mid$(sT, lPos - 1, 1)
      sCE = Mid$(sT, lPos + 1, 1)
      If 0 <> InStr(sNum, sCB) And 0 <> InStr(sNum, sCE) Then
        Mid$(sT, lPos) = "x"
        lStart = lPos + 1
      Else
        lStart = lPos + 1
      End If
    End If
  Loop
  lStart = 1
  Do While True
    ' Замена русской буквы х
    lPos = InStr(lStart, sT, "х")
    If 0 = lPos Then
      Exit Do
    ElseIf 1 = lPos Then
      ' Первая позиция - анализировать нечего - начинаем поиск со следующего символа
      lStart = lPos + 1
    ElseIf lLen = lPos Then
      ' Последняя позиция - анализировать нечего - выходим из цикла
      Exit Do
    Else
      sCB = Mid$(sT, lPos - 1, 1)
      sCE = Mid$(sT, lPos + 1, 1)
      If 0 <> InStr(sNum, sCB) And 0 <> InStr(sNum, sCE) Then
        Mid$(sT, lPos) = "x"
        lStart = lPos + 1
      Else
        lStart = lPos + 1
      End If
    End If
  Loop
  sArtX = sT
End Function
Функция работает следующим образом: обрабатываемая строка последовательно анализируется на наличие одного из трёх неправильных символов, а затем проверяется символы до и после найденного, если это числа, то заменяем на латинскую букву "x".

Для проверки работы программы в архиве есть тестовый файл: test 2018-12-18.txt
Результат обработки смотрите в файле: X00.temp.txt
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2019, 12:58
Ответы с готовыми решениями:

Обработка pdf файлов в каталогах с подкаталогами
К примеру в каталоге c:\dir1 и его подкаталогах находятся pdf файлы. Их необходимо найти и передать утилите pdftotext. Команда в простейшем...

Поиск и вывод строк из файлов в нескольких каталогах
Всем привет! Есть 23 каталога (6501-6523), в каждом каталоге есть соответствующий файл rez.01. Вот мудрю код, который должен найти...

Индексация картин
Здравствуйте. Проблема в следующем. На сайте artpanorama.su нужно было большие и средние картины выставлять с водяным знаком. Я не стала...

4
 Аватар для Kogb
367 / 128 / 28
Регистрация: 17.07.2011
Сообщений: 253
Записей в блоге: 1
16.03.2019, 20:57
А вопрос в чем?
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
17.03.2019, 11:09
Лучший ответ Сообщение было отмечено zink0000 как решение

Решение

zink0000, эту работу лучше регэкспу поручить: заменить буквы х,Х (рус) и X (лат), возможно с пробелами, между двумя цифрами, на x (лат).
Visual Basic
1
2
3
4
5
6
7
8
Function sArtX1(sL As String) As String
Static re As Object
  If re Is Nothing Then
    Set re = CreateObject("vbscript.regexp")
    re.Pattern = "(\d) *[XХх] *(\d)"
  End If
  sArtX1 = re.Replace(sL, "$1x$2")
End Function
Тест в Immediate
Code
1
2
3
4
5
6
7
8
?sartx1("Слава Богу понемногу научились по Ван Гогу (2014; холст, масло; 45 х 72)")
Слава Богу понемногу научились по Ван Гогу (2014; холст, масло; 45x72)
 
?sartx1("Цветочки (1997; картон, масло; 57Х47)")
Цветочки (1997; картон, масло; 57x47)
 
?sartx1("Хрень зелёная (2011; холст, масло; 60  х 48.5)")
Хрень зелёная (2011; холст, масло; 60x48.5)
2
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
23.03.2019, 16:06  [ТС]
Казанский, по крайней мере в VB5 компилятор проглотил. Спасибо.

Добавлено через 1 минуту
Kogb, у меня чаще не вопросы, а просто предлагаемый вариант решения.
0
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
23.03.2019, 16:10  [ТС]
Улучшенный вариант программы, который обрабатывает не один файл, а целую папку со всеми подкаталогами.

В папке TEST пример для обработки, а в архиве TEST.zip пример в запакованном виде.

Исходник:
X00 02.zip
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2019, 16:10
Помогаю со студенческими работами здесь

Выставка картин
задача: ассоциация художников провела выставку-продажу картин. В течении недели (с понедельника) ежедневно выставлялись по 24 картины. О...

Перелистывание картин
Как сделать перелистование (несколько изображений) с кнопки Speedbutton, и когда нажимал на кнопку звук была озвучивание каждого животного...

Галлерея для картин
Пишу простенький сайт HTML CSS JS, для знакомого художника подскажите удобные шаблоны для галлереи их много очень, чтобы было просто и user...

Onclick для всех картин
Можно ли применить onclick = 'openImageWindow(this.src);' ко всем картинам внутри конкретного div-а?

И снова Картин.Яндекса игнорируют..
Это типа флуд?) Я ж не спрашивал сколько траффика яндекс дает. Я не понимаю, почему изображения не входят в индекс.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru