PiligrimSoft - Freelance разработка
Меню сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Тестовое задание DZ, Digital Zone, DZ Systems, Е-legion.

Техническое задание

Разработчик VB.NET

 

На сайте fias. nalog.ru в разделе: Обновления/Полная БД ФИАС располагаются архивы адресного классификатора в xml формате.

Задание: Разработать консольное приложение, которое:

1) Распакует архив и достанет данные о номерах домов.

2) Создаст в MSSQL, новую БД и создаст в ней таблицу, в которую будут сводиться данные о номерах домов.

3) Произведет многопоточный импорт данных в ранее созданную таблицу данных о номерах домов без использования готового XML парсера (т.е. его нужно сделать свой).

P.S. дома можно заменить на участки, адресные объекты, комнаты, нормативные документы

Также на свое усмотрение, Вы можете что-то добавить, то, что считаете важным для правильного функционирования программы.

 

Решение PiligrimSoft, приношу извинения, форматирование кода (отступы) нарушено конвертером кода в HTML:

 

VB.NET - Скачать исходник

 
  1. Imports System
  2. Imports System.IO
  3. Imports System.IO.Compression
  4. Imports System.Xml
  5. Imports System.Threading
  6. Imports System.Threading.Tasks
  7. Imports System.Data.SqlClient
  8.  
  9.  
  10. Module Test_DZ
  11. Const strTblName As String = "DZ_Test" 'Имя таблицы
  12. Dim strListNode As New List(Of String)
  13. Sub Main()
  14.  
  15. #Region "Константы"
  16. Const strZipPath As String = ".\fias_delta_xml.zip" 'Имя скаченого архива с https://fias.nalog.ru/, должен находиться в корневой папке c .exe, при отладке в \bin\Debug
  17. Const strExtractPath As String = ".\extract" 'путь распаковки архива отнсительно исполняемого файла
  18. Const mskXmlFile As String = "AS_NORMDOC_*.XML" 'Маска имени обрабатываемого XML файла c номерами нормативных документов
  19. Const strID As String = "DOCNUM" 'Узел данных из XML для обработки
  20. Const strServerSQL As String = "HP-book" 'Имя SQL сервера
  21. Const strDBName As String = "db_DZ_Test" 'Имя базы данных
  22.  
  23. 'SQL скрипт, если база существует - удаляем, и создаем новую
  24. Const strDBNewCreat As String = "DROP DATABASE IF EXISTS " & strDBName & ";" &
  25. "create database " & strDBName
  26. 'SQL скрипт, создаем таблицу
  27. Const strTblNew As String = "create table " & strTblName &
  28. "( NUMDOC TEXT Not null);"
  29. #End Region
  30.  
  31. #Region "Переменные"
  32. Dim DocXML As New XmlDocument()
  33. Dim strFileNameXML As String()
  34. #End Region
  35.  
  36.  
  37. 'Удаляем директорию если есть, и создаем папку для распаковки архива - .\extract
  38. If Directory.Exists(strExtractPath) = True Then Directory.Delete(strExtractPath, True)
  39. Directory.CreateDirectory(strExtractPath)
  40.  
  41. ' Распаковка архива
  42. Console.WriteLine("Распаковка архива, ожидайте...")
  43. ZipFile.ExtractToDirectory(strZipPath, strExtractPath)
  44. Console.WriteLine("Распаковка архива закончена.")
  45.  
  46. 'Получаем имена файлов из распакованного архива согласно маске
  47. strFileNameXML = Directory.GetFiles(strExtractPath, mskXmlFile)
  48.  
  49. 'Загрузка Xml документа согласно маске
  50. Console.WriteLine("Загружаю данные, ожидайте...")
  51. DocXML.Load(strFileNameXML.First)
  52.  
  53.  
  54. '==============================================================================================
  55.  
  56. 'Формирование списка искомых значений узла
  57.  
  58. '==============================================================================================
  59.  
  60. Dim xRoot As XmlElement = DocXML.DocumentElement()
  61. Dim xAttr As XmlNode
  62.  
  63. Console.WriteLine("Обработка данных, ожидайте...")
  64.  
  65. For Each xNode As XmlNode In xRoot
  66.  
  67. 'If xNode.Attributes.Count > 0 Then
  68. xAttr = xNode.Attributes.GetNamedItem(strID)
  69. ' If xAttr IsNot Nothing Then
  70. strListNode.Add(xAttr.Value.ToString)
  71. ' End If
  72. 'End If
  73. Next
  74.  
  75. '==============================================================================================
  76.  
  77. 'SQL
  78.  
  79. '==============================================================================================
  80.  
  81. 'Коннектимся с master и создаем БД
  82. Console.WriteLine("Подключаюсь к SQL серверу.")
  83. CreateSQLElem(strDBNewCreat, "Server=" & strServerSQL & ";Integrated security=SSPI;database=master", "База данных создана.")
  84. 'Коннектимся с созданой БД и создаем таблицу
  85. CreateSQLElem(strTblNew, "Server=" & strServerSQL & ";Integrated security=SSPI;database=" & strDBName, "Таблица создана.")
  86.  
  87. 'Вносим данные в таблицу, "параллельный" ввод
  88. Console.WriteLine("Экспорт данных в созданную таблицу, ожидайте...")
  89. CreateSQLElem("Prl", "Server=" & strServerSQL & ";Integrated security=SSPI;database=" & strDBName, "Данные в БД SQL внесены.")
  90.  
  91. End Sub
  92.  
  93. Private Sub CreateSQLElem(ScriptSQl As String, strConnConf As String, ConsoleTxt As String) 'Коннектинг с SQL сервером
  94.  
  95. Dim myConn As SqlConnection = New SqlConnection(strConnConf)
  96. Dim myCommand As SqlCommand = New SqlCommand(ScriptSQl, myConn)
  97.  
  98.  
  99.  
  100. If ScriptSQl = "Prl" Then 'Если "Prl" - запускаем "параллельное" заполнение ранее созданной табл.
  101. Parallel.ForEach(strListNode, Sub(ToTbl)
  102. ScriptSQl = "INSERT INTO " & strTblName & " ( NumDoc ) VALUES('" & ToTbl & "'); "
  103. Using myConn1 As SqlConnection = New SqlConnection(strConnConf),
  104. myCommand1 As SqlCommand = New SqlCommand(ScriptSQl, myConn1)
  105.  
  106. myConn1.Open()
  107. myCommand1.ExecuteNonQuery()
  108. myConn1.Close()
  109.  
  110. End Using
  111. End Sub)
  112.  
  113. Else ' Если не "Prl" - последовательно создаются БД и Таблица
  114. Try
  115. myConn.Open()
  116. myCommand.ExecuteNonQuery()
  117.  
  118. Console.WriteLine(ConsoleTxt)
  119. Catch ex As Exception
  120. Console.WriteLine(ex.ToString())
  121. Console.Read()
  122. Finally
  123.  
  124.  
  125. End Try
  126. If (myConn.State = ConnectionState.Open) Then
  127. myConn.Close()
  128. End If
  129. End If
  130. End Sub
  131.  
  132. End Module

 VB.NET - Скачать исходник

Вход на сайт
Поиск
Календарь
«  Октябрь 2021  »
ПнВтСрЧтПтСбВс
    123
45678910
11121314151617
18192021222324
25262728293031
Архив записей
Друзья сайта
PiligrimSoft © 2021Хостинг от uCoz