Добро пожаловать!

Войдите или зарегистрируйтесь сейчас!

Войти

Экспорт таблицы в txt

Тема в разделе "MapInfo", создана пользователем yeti, 18 сен 2017.

  1. yeti

    Форумчанин

    Регистрация:
    24 апр 2014
    Сообщения:
    60
    Симпатии:
    0
    Добрый день!
    Пытаюсь, через mapbasic, записать в текстовый файл имена выбранных точек, один набор - одна строчка.
    Столкнулся с такой проблемой, исходные точки идут по порядку, а во временной таблице они в разнобой и как в текстовый файл дописать новый набор точек с новой строки.
    Помогите, пожалуйста! ::sad24.gif::
    Без имени-1.jpg

    Код:
    Include "mapbasic.def"
    Include "icons.def"
    Declare Sub Main
    Declare Sub prof
     
    Global tab_start,tab_dir as String
    Global i,layer_id  As integer
    Global win_name as String
    Global selregion As Object
    Global pn as String
     
     
     
     
    Sub Main
    Alter ButtonPad ID 3 ' изменяем панель Программы
    add ' добавляем
      separator ' разделитель
      ToolButton ' кнопку
    Icon MI_ICON_LETTERS_X
    HelpMsg "точки для профилей \n точки для профилей" ' первая - комент в строке состояния, вторая - под кнопкой 
    Cursor MI_CURSOR_CROSSHAIR
    DrawMode DM_CUSTOM_POLYGON
    Calling prof
    end sub
     
    Sub prof
    selregion = CommandInfo(CMD_INFO_CUSTOM_OBJ)   ' запоминаем выбранный регион
    win_name = FrontWindow()                        ' верхнее окно
    layer_id = 1                                                 ' 1й слой карты
    tab_start = LayerInfo(win_name, layer_id, LAYER_INFO_NAME)   ' его имя
     
    print tab_start
     
    Select col1 ' выбираем только имена 
    From tab_start 
    Where selregion Contains obj 
    into tab_temp  ' выбрать из tab_start объекты попадающие в selregion, записать в tab_temp
     
    'print chr$(12) ' очистить окно Сообщение
    'print "Выбрано: "+ Str$(SelectionInfo(SEL_INFO_NROWS))+" п.н."
     
    i = InStr(1, TableInfo(tab_start,TAB_INFO_TABFILE), ".TAB")  ' позиция курсора в полном путе к tab_start где встречается ее расширение
    if i=0 then 
    i = InStr(1, TableInfo(tab_start,TAB_INFO_TABFILE), ".tab") ' тоже самое на случай прописных букв
    end if
    tab_dir=Left$(TableInfo(tab_start,TAB_INFO_TABFILE),i-1) ' папка и имя tab_start
     
    Open File tab_dir+"_prof.txt" For Output As #1 charset "WindowsCyrillic" ' создаем файл txt с именем как tab и в тойже папке, выбираем кодировку
     
    Fetch First From tab_temp  ' перебираем объекты
    Do Until EOT(tab_temp)  ' если не конец
    pn=pn+ Chr$(9) + tab_temp.col1
    Fetch Next From tab_temp 
    Loop
    print #1, "prof_1" + pn
     
    'Close Table tab_temp
    Close File #1
     
    print "сохранено:"
    print tab_dir+"_prof.txt"
    End Sub
     

    Вложения:

    • prof.rar
      Размер файла:
      2,1 КБ
      Просмотров:
      1
    #1
  2. MaksNik

    Форумчанин

    Регистрация:
    3 июн 2013
    Сообщения:
    64
    Симпатии:
    30
    ПРиветствую. К сожелению, сейчас нет установленного MapBasic, по этому не могу проверить код. Но вот это место интересно
    Почему запись в файл идет за циклом???
    Попробуй так (mapbasic автоматически добавляет в конец строки коды переноса и возврата каретки)

    Fetch First From tab_temp ' перебираем объекты
    Do Until EOT(tab_temp) ' если не конец
    print #1, "prof_1" + tab_temp.col1
    Fetch Next From tab_temp
    Loop

    А вот вопрос про последовательность записи имен не понял - в выбранной таблице (Selection) не так пронумерованы объекты как в конечном файле?
     
    #2
  3. yeti

    Форумчанин

    Регистрация:
    24 апр 2014
    Сообщения:
    60
    Симпатии:
    0
    спасибо за ответ! в цикле я делаю для того что бы в строчку записать сразу весь набор точек (выбрал - записал, выбрал - записал) и вначале его стоит некое слово prof (которое должно увеличиваться). И точки должны записаться последовательно, но в исходной таблице они идут по порядку, а во временной почему-то вразнобой. Это можно решить сортировкой по Х или по У... Но я не знаю как дописывать файл и чтоб с новой строки.
    На картинке показал какой у меня выходит результат. это я записал три раза, prof только первый раз был, и дважды точки идут не последовательно
    Без имени-2.jpg
     
    #3
  4. MaksNik

    Форумчанин

    Регистрация:
    3 июн 2013
    Сообщения:
    64
    Симпатии:
    30
    Как я выше описал записывай в цикле не в переменную, а сразу в файл

    Код:
    Fetch First From tab_temp ' перебираем объекты
    Do Until EOT(tab_temp) ' если не конец
    
    
    
    
    print #1, "prof_1" + tab_temp.col1
    
    
    Fetch Next From tab_temp 
    Loop
    если все же хочется через переменную то как то так надо добавлять символ №10 (9 - табуляция)
    Chr$(10)
     
    #4
  5. yeti

    Форумчанин

    Регистрация:
    24 апр 2014
    Сообщения:
    60
    Симпатии:
    0
    я выбираю 5 точек, они с разделителем - Табулятор записываются в строку, в файл это prof1.
    Затем выбираю еще точки, в текстовом файле записывается новая строка (prof2) с этими точками.
    В случае, когда делать это в цикле, то для одного набора каждая точка записывается с новой строки.
     
    #5
  6. yeti

    Форумчанин

    Регистрация:
    24 апр 2014
    Сообщения:
    60
    Симпатии:
    0
    сделал отдельно две кнопки, для горизонтальных профилей и для вертикальных. еще раньше переменная pn постоянно дописывалась к старому набору и из-за этого получался один длинный профиль. сейчас разделил.
    Но как дописывать файл? и можно ли как то сделать счетчик профилей
    Оффтоп

    Код:
    Include "mapbasic.def"
    Include "icons.def"
    Declare Sub Main
    Declare Sub prof_X
    Declare Sub prof_Y
    Declare Sub record
     
    Global tab_start,tab_dir as String
    Global i,layer_id  As integer
    Global win_name as String
    Global selregion As Object
    Global pn as String
     
     
     
     
    Sub Main
    Alter ButtonPad ID 3 ' изменяем панель Программы
    add ' добавляем
      separator ' разделитель
      ToolButton ' кнопку
    Icon MI_ICON_ARROW_1
    HelpMsg "точки для профилей \n точки для профилей" ' первая - комент в строке состояния, вторая - под кнопкой
    Cursor MI_CURSOR_CROSSHAIR
    DrawMode DM_CUSTOM_POLYGON
    Calling prof_X
    ToolButton ' кнопку
    Icon MI_ICON_ARROW_4
    HelpMsg "точки для профилей \n точки для профилей" ' первая - комент в строке состояния, вторая - под кнопкой
    Cursor MI_CURSOR_CROSSHAIR
    DrawMode DM_CUSTOM_POLYGON
    Calling prof_Y
     
    end sub
     
    Sub prof_X
    selregion = CommandInfo(CMD_INFO_CUSTOM_OBJ)   ' запоминаем выбранный регион
    win_name = FrontWindow()                        ' верхнее окно
    layer_id = 1                                                 ' 1й слой карты
    tab_start = LayerInfo(win_name, layer_id, LAYER_INFO_NAME)   ' его имя
     
    Select col1,centroidX(obj),centroidY(obj)
    From tab_start
    Where selregion Contains obj
    into tab_temp  ' выбрать из tab_start объекты попадающие в selregion, записать в tab_temp
    Order By 2 ' сортировать по X
     
    call record
    End Sub
     
    Sub prof_Y
    selregion = CommandInfo(CMD_INFO_CUSTOM_OBJ)   ' запоминаем выбранный регион
    win_name = FrontWindow()                        ' верхнее окно
    layer_id = 1                                                 ' 1й слой карты
    tab_start = LayerInfo(win_name, layer_id, LAYER_INFO_NAME)   ' его имя
     
    Select col1,centroidX(obj),centroidY(obj)
    From tab_start
    Where selregion Contains obj
    into tab_temp  ' выбрать из tab_start объекты попадающие в selregion, записать в tab_temp
    Order By 3 Desc ' сортировать по Y (в обратном порядке, с верху в низ)
     
    call record
    End Sub
     
    Sub record
     
    i = InStr(1, TableInfo(tab_start,TAB_INFO_TABFILE), ".TAB")  ' позиция курсора в полном путе к tab_start где встречается ее расширение
    if i=0 then
    i = InStr(1, TableInfo(tab_start,TAB_INFO_TABFILE), ".tab") ' тоже самое на случай прописных букв
    end if
    tab_dir=Left$(TableInfo(tab_start,TAB_INFO_TABFILE),i-1) ' папка и имя tab_start
     
    Open File tab_dir+"_prof.txt" For Output As #1 charset "WindowsCyrillic" ' создаем файл txt с именем как tab и в тойже папке, выбираем кодировку
     
    pn="начало"
     
    Fetch First From tab_temp  ' перебираем объекты
    Do Until EOT(tab_temp)  ' если не конец
    if pn="начало" then
    pn=tab_temp.col1
    else
    pn=pn+ Chr$(9) + tab_temp.col1
    end if
    Fetch Next From tab_temp
    Loop
    print #1, "prof_1" + Chr$(9) + pn
     
    'Close Table tab_temp
    Close File #1
     
    print "сохранено:"
    print tab_dir+"_prof.txt"
    End Sub
     
    #6
  7. yeti

    Форумчанин

    Регистрация:
    24 апр 2014
    Сообщения:
    60
    Симпатии:
    0
    чтоб дописать файл, его надо открыть через Append
    Код:
    Open File tab_dir+"_prof.txt" For Append As #1 charset "WindowsCyrillic"
    осталось решить как сделать счетчик
    --- Сообщения объединены, 29 сен 2017, Оригинальное время сообщения: 29 сен 2017 ---
    + счетчик
    Код:
     i=1
    Input #1, win_name
    Do Until EOF(1) 
    i=i+1
    Input #1, win_name
    Loop
    почему-то строки куда-то надо записывать, чтоб не делать новые переменные использовал уже свободные.
    Окончательный текст программы в прикрепленном файле
     

    Вложения:

    • prof.rar
      Размер файла:
      2,5 КБ
      Просмотров:
      0
    #7
  8. yeti

    Форумчанин

    Регистрация:
    24 апр 2014
    Сообщения:
    60
    Симпатии:
    0
    теперь нужно выделенные точки соединить линией, план такой:
    открываем таблицу, первый раз ее нет, тогда создаем ее, присоединяем карту, добавляем слой
    Код:
    OnError Goto creat_tabl
    Open Table tab_dir+"_prof" as tab_start+"_prof"
     
    open_map:
    Create Map For tab_start+"_prof" CoordSys Table tab_start ' присоединяем карту, сист.коор из tab_start
    Add Map Layer tab_start+"_prof" position 20 ' добавляем слой
     ......
     
    creat_tabl:
    Create Table tab_start+"_prof" (n char(10)) ' создание табл
    Resume open_map
     .......
    
    но при первом запуске входит ошибка что файл не найден и таблицу открыть не удалось.
    Программа вылетает, при этом создаются два файла с расширением tab и dat и при повторном запуске программы все проходит.
    Может кто знает в чем ошибка? помогите пожалуйста ::rolleyes24.gif::
     
    #8
  9. MaksNik

    Форумчанин

    Регистрация:
    3 июн 2013
    Сообщения:
    64
    Симпатии:
    30
    Как мало информации, но попробуем разобраться...
    1. Выполняются ли проверки на присутствие таблицы? (если не открыта, то открываем)
    2. Выполняется ли проверка на наличие открытых карт? (если карта не создана, то создаем из "нашего" слоя)
    3. Если таблица открыта и карта есть то добавляем нашу таблицу к карте.
     
    #9
  10. yeti

    Форумчанин

    Регистрация:
    24 апр 2014
    Сообщения:
    60
    Симпатии:
    0
    выполняется.
    вначале таблицы нет, выходит ошибка, в этом случае переходим к созданию таблицы после чего возвращаемся создаем карту и добавляем слой
     
    #10
  11. MaksNik

    Форумчанин

    Регистрация:
    3 июн 2013
    Сообщения:
    64
    Симпатии:
    30
    Вот по быстрому накадал..


    dim winMapIsExist as logical
    dim tableIsOpen as logical
    dim i as integer
    define TAB_PATH "C:\Users\Maks\Documents\"
    define TAB_NAME "моя_таблица"

    'проверям существования фала на диске.
    'если файла нет, то создаем
    if not FileExists(TAB_PATH + TAB_NAME + ".TAB") then
    'создание части с данными (*.dat, *.tab)
    Create Table TAB_NAME (qqq Char(10))
    file TAB_PATH + TAB_NAME + ".TAB"
    Type NATIVE
    Charset "WindowsCyrillic"

    ' создание части для карты (*.map, *.id)
    Create Map For TAB_NAME
    End If
    'Проверяем не загружена ли таблица
    tableIsOpen = false
    for i = 1 to NumTables()
    if TableInfo(i,TAB_INFO_NAME) = TAB_NAME then
    tableIsOpen = true
    exit for
    End If
    Next

    'Открываем таблицу
    if tableIsOpen = false then
    Open Table TAB_PATH + TAB_NAME + ".TAB"
    End If

    if NumWindows() > 0 then
    'Если есть открытые карты добавляем в них нашу таблицу
    winMapIsExist = false

    for i = NumWindows() to 1 step -1
    if WindowInfo(i, win_info_type) = WIN_MAPPER then

    'добавляем слой в карту
    Add Map Auto Layer TAB_NAME
    winMapIsExist = true
    end if
    next

    else
    ' Если карты нет - создадим ее из нашего слоя
    if winMapIsExist = false then
    Map From TAB_NAME
    end if
    end if
     
    #11

Поделиться этой страницей

  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление