powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразовать обычный текст в табличный с разделителями
12 сообщений из 12, страница 1 из 1
Преобразовать обычный текст в табличный с разделителями
    #37604949
EvAnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте! С Рождеством!

Уважаемые знатоки, нужна ваша помощь. Хотя бы подтолкнуть в нужном направлении или просто даже советом. К сожалению, ничего подходящего по Форуму не нашёл. Может, плохо искал, а может, и ничего в найденном не понял (прошу тогда прощения).
Проблема/задача такая. Имеется вордовский документ, в котором находится таблица. По сути же, таблицей её можно назвать только чисто "визуально": строки, столбцы и значения ячеек сформированы расстановкой пробелов. Примерно так:

1...Он......Там,Сям
2...Она.....Везде,Нигде
…............Где-то
3...Оно....Там,Сям
...............Везде,Нигде
...............Никому,Никогда

То есть, здесь три столбца и три строки - 9 ячеек (извиняюсь за жаргон :-) ); в конце каждой строчки, соответственно, - энтер.

Так вот: необходимо ПРОГРАММНО корректно преобразовать этот текст в текст с разделителями для последующего импорта в БД.
1. Задача минимум: обработатывать нужный фрагмент текста VBA-кодом; для этого нужный кусок можно на худой конец скопипэйстить из файла и вручную.
2. Задача максимум: программно открывать файл, считывать из нужного места до нужного места и программно преобразовывать его в таблицу в текстовом формате с разделителями полей.
Потыкался было с импортом-экспортом – нет света в тонелле; попробовал риплэйсить поэтапно пробелы (группы пробелов) – с тем же успехом.
Задача, знаю точно, решаема. По ссылкам ниже (сами файлы объёмные) можно обнаружить как раз оба варианта: один в исходном формате, второй - в виде похожей на правду таблицы (в принципе пригодной для импорта, правда, с предварит программной обработкой).
Интересно, что из чего сделано. Два варианта: либо второй (табличный) файл из первого, либо наоборот: изначально исходный формат именно табличный, а тот, что нужен сейчас, - производный от него. Но это без разницы: если знать "как туда" - значит знать, как и "в обратную сторону".
(Хотя, может быть, я перегибаю со сложностью. По невежеству... :-))) )
Сразу отвечю, почему не устраивает второй, уже сделанный кем-то, табличный, вариант. Причин, как минимум, две:
- это официальный нормативный документ, а найти его в виде таблицы на ресурсе, заслуживающем доверия (ну или похожего на это), я лично не смог;
- на госуд сайтах табличный файл либо разбит на неск частей («томов», не знаю, откуда взяли этот термин), либо вообще он урезан (!) в неск раз.

Требуемый текстовый вариант можно скачать отсюда («Общероссийский классификатор территорий муниципальных образований» - ОКТМО):
http://base.consultant.ru/cons/cgi/online.cgi?req=doc;base=LAW;n=113284;fld=134;dst=100003
Табличный, - например, здесь: http://chita.gks.ru/method/classifier/%D0%9E%D0%9A%D0%A2%D0%9C%D0%9E.aspx, здесь:
http://chita.gks.ru/method/classifier/%D0%9E%D0%9A%D0%A2%D0%9C%D0%9E.aspx или здесь: http://www.kalugastat.ru/method/classifier/ОКТМО.aspx

Спасибо всем, кто откликнулся!
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605193
Pavel Berezin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а зачем именно ПРОГРАММНО?
Эксель прекрасно прожёвывает и парзит CSV/TSV-файлы.
Ещё лучше это делает Ацесс - присоединяете (либо импортируете) такой текстовый файл как таблицу, и работаете с уже распарзенными полями. К тому-же там уже есть готовые средства для коннекции/экспорта в любые серьёзные БД (т.е. Ацесс можно использовать как транзитный конвертор-загрузчик).
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605235
EvAnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел, спасибо, что откликнулись (что хоть осталась ещё живая душа... :-) )
Pavel Berezin...Эксель прекрасно прожёвывает и парзит CSV/TSV-файлы.
Ещё лучше это делает Ацесс - присоединяете (либо импортируете) такой текстовый файл как таблицу, и работаете с уже распарзенными полями. К тому-же там уже есть готовые средства для коннекции/экспорта в любые серьёзные БД (т.е. Ацесс можно использовать как транзитный конвертор-загрузчик).
EvAnd...Потыкался было с импортом-экспортом – нет света в тонелле; попробовал риплэйсить [как раз в Аксессе... :-)] поэтапно пробелы (группы пробелов)...
Pavel BerezinНу а зачем именно ПРОГРАММНО?

Речь идёт о регулярном - и актуальном! - обновлении информации (в БД) на (каждом!) ПК... Лично я не в силах ни заставить, ни научить, ни объяснить: каждому, любому, другому... - как это, видите ли, элементарно делается "пользовательскими средствами": "мозгами" и "образованием"... Специфика же такая :-)))
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605244
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если речь идёт именно о конвертации ОКТМО - то не вижу проблемы. В твоей "чисто визуально таблице" всё готово для ТРИВИАЛЬНОГО импорта в БД. С фиксированной шириной полей.
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605259
EvAnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЕсли речь идёт именно о конвертации ОКТМО - то не вижу проблемы. В твоей "чисто визуально таблице" всё готово для ТРИВИАЛЬНОГО импорта в БД. С фиксированной шириной полей.
И как вы в подробностях предлагаете?... (Давно над этим бьюсь...)
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605443
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvAndAkinaЕсли речь идёт именно о конвертации ОКТМО - то не вижу проблемы. В твоей "чисто визуально таблице" всё готово для ТРИВИАЛЬНОГО импорта в БД. С фиксированной шириной полей.
И как вы в подробностях предлагаете?... (Давно над этим бьюсь...)Есть такая функция MID()...
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605462
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
AkinaЕсли речь идёт именно о конвертации ОКТМО - то не вижу проблемы. В твоей "чисто визуально таблице" всё готово для ТРИВИАЛЬНОГО импорта в БД. С фиксированной шириной полей.
+1

импортировать, "как есть", во времянку
а потом "пройтись" по рекордсету этой времянки, формируя запись уже в "людском" виде
и сохраняя её в постаянную табл.
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605471
AndreyRnD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvAnd,

вот здесь можно скачать вордовский файл ОКТМО http://www.gks.ru/metod/classifiers.html

перекиньте таблицу в ексель и делайте с ней что вашей душе угодно
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605552
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel BerezinНу а зачем именно ПРОГРАММНО?
Эксель прекрасно прожёвывает и парзит CSV/TSV-файлы.
Ещё лучше это делает Ацесс - присоединяете (либо импортируете) такой текстовый файл как таблицу, и работаете с уже распарзенными полями. К тому-же там уже есть готовые средства для коннекции/экспорта в любые серьёзные БД (т.е. Ацесс можно использовать как транзитный конвертор-загрузчик).

Собственно Access дает лишь интерфейс, а все выполняется с помощью ADODB.

Примерчик на данную тему (я его уже тут приводил):

Код: vbnet
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.
Public Sub Main()
    Const sPathIn As String = "C:\Temp\"
    Const sPathOut As String = "C:\Temp\"
    Const sFileIn As String = "File.txt"
    Const sFileOut As String = "NewFile.txt"

    Dim cn As New ADODB.Connection, r As New ADODB.Recordset, _
        s As String, ss As String, sSchemaIni As String, i As Integer

    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & sPathIn & ";" & _
          "Extended Properties=Text"

    ' Создадим файл откуда берем данные для теста
    For i = 0 To 100
        s = Mid$(Format$(Rnd, ".0000000"), 2)
        ss = ss & Mid$(s, 1, 1) & "," & Mid$(s, 2, 1) & "," & Mid$(s, 3, 1) & "." & CInt(Mid$(s, 4, 3)) & "," & Mid$(s, 7, 1) & vbCrLf
    Next i
    s = sPathOut & sFileIn
    If FileExists(s) Then Kill s
    SaveFile s, ss
    
    ' Удалим выходной файл
    s = sPathOut & sFileOut
    If FileExists(s) Then Kill s
    
    ' Создадим schema.ini
    sSchemaIni = sPathOut & "schema.ini"
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    ss = "[File.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf _
        & vbCrLf _
        & "[NewFile.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "NumberDigits=4" & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf
        
    SaveFile sSchemaIni, ss
    
    ' Импортируем данные
    On Error GoTo Err_
    r.Open "SELECT * INTO [" & sFileOut _
                    & "] IN '" & sPathOut & "' [Text;] " _
            & "FROM [" & sFileIn _
            & "] ORDER BY 1,2,3,4", cn, _
                    adOpenStatic, adLockReadOnly, adCmdText
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    Exit Sub

Err_:
    With cn.Errors(0)
        If .NativeError = -329323426 And .Number = -2147467259 Then Resume Next
    End With
    MsgBox Err.Description, vbCritical
End Sub

Private Function FileExists(sFile As String) As Boolean
    On Error Resume Next
    FileExists = ((GetAttr(sFile) And vbDirectory) = 0)
    If Err.Number Then Err.Clear
End Function

Private Sub SaveFile(sFile As String, sText As String)
    Dim iHFile As Integer
    
    iHFile = FreeFile
    Open sFile For Binary As #iHFile
    Put iHFile, , sText
    Close #iHFile
End Sub



Ну и можно еще тут посмотреть.
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605945
EvAnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFСобственно Access дает лишь интерфейс, а все выполняется с помощью ADODB.

Примерчик на данную тему ...
AndrF, спасибо за отзыв, здравстуйте!
Файл sFileIn создаётся.
Вот на этой строке слетает на ошибку:
Код: vbnet
1.
    SaveFile sSchemaIni, ss


При этом файл schema.ini тоже создаётся. Вот его текст:
[File.txt]
ColNameHeader=False
CharacterSet=1251
Format=Delimited(,)
DecimalSymbol=.
Col1=F1 Integer
Col2=F2 Integer
Col3=F3 Float
Col4=F4 Integer

[NewFile.txt]
ColNameHeader=False
CharacterSet=1251
Format=Delimited(,)
DecimalSymbol=.
NumberDigits=4
Col1=F1 Integer
Col2=F2 Integer
Col3=F3 Float
Col4=F4 Integer

Обратите ещё внимание! Я изменил 2 строки (добавил черту в названии пути).
Здесь:
Код: vbnet
1.
2.
3.
4.
    Next i
    s = gstrClsssPathFolder & "\" & sFileIn ' - эту
    If FileExists(s) Then Kill s
    SaveFile s, ss

и здесь:
Код: vbnet
1.
2.
    ' Создадим schema.ini
    sSchemaIni = gstrClsssPathFolder & "\" & "schema.ini

(без этого тоже возникали ошибки)

А что дожно получиться в итоге? :-)
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37605987
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так текст ошибки вроде даже по-русски вам рассказал, в чем проблема
А именно в Format=Delimited(,)поскольку у вас, наверняка, системный разделитель целой и дробной части - такой же.
Тут решения два - либо менять системный разделитель на ".", либо разделитель полей в файле на другой (например, ; или табулятор).
...
Рейтинг: 0 / 0
Преобразовать обычный текст в табличный с разделителями
    #37606069
EvAnd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMНу так текст ошибки вроде даже по-русски вам рассказал, в чем проблема
А именно в Format=Delimited(,)поскольку у вас, наверняка, системный разделитель целой и дробной части - такой же.
Тут решения два - либо менять системный разделитель на ".", либо разделитель полей в файле на другой (например, ; или табулятор).
Что такое разделитель, я знаю. Знаю, где изменить его значение... Я ещё сути не понял, что творю
1. Что делает эта процедура?
2. Что должно получится в итоге?
Спасибо :-)
(Поменял в процедуре на ";" - тоже самое ) )
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразовать обычный текст в табличный с разделителями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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