Тестовое задание DZ, Digital Zone, DZ Systems, Е-legion.
Техническое задание
Разработчик VB.NET
На сайте fias. nalog.ru в разделе: Обновления/Полная БД ФИАС располагаются архивы адресного классификатора в xml формате.
Задание: Разработать консольное приложение, которое:
1) Распакует архив и достанет данные о номерах домов.
2) Создаст в MSSQL, новую БД и создаст в ней таблицу, в которую будут сводиться данные о номерах домов.
3) Произведет многопоточный импорт данных в ранее созданную таблицу данных о номерах домов без использования готового XML парсера (т.е. его нужно сделать свой).
P.S. дома можно заменить на участки, адресные объекты, комнаты, нормативные документы
Также на свое усмотрение, Вы можете что-то добавить, то, что считаете важным для правильного функционирования программы.
Решение PiligrimSoft, приношу извинения, форматирование кода (отступы) нарушено конвертером кода в HTML:
VB.NET - Скачать исходник
-
Imports System
-
Imports System.IO
-
Imports System.IO.Compression
-
Imports System.Xml
-
Imports System.Threading
-
Imports System.Threading.Tasks
-
Imports System.Data.SqlClient
-
-
-
Module Test_DZ
-
Const strTblName As String = "DZ_Test" 'Имя таблицы
-
Dim strListNode As New List(Of String)
-
Sub Main()
-
-
#Region "Константы"
-
Const strZipPath As String = ".\fias_delta_xml.zip" 'Имя скаченого архива с https://fias.nalog.ru/, должен находиться в корневой папке c .exe, при отладке в \bin\Debug
-
Const strExtractPath As String = ".\extract" 'путь распаковки архива отнсительно исполняемого файла
-
Const mskXmlFile As String = "AS_NORMDOC_*.XML" 'Маска имени обрабатываемого XML файла c номерами нормативных документов
-
Const strID As String = "DOCNUM" 'Узел данных из XML для обработки
-
Const strServerSQL As String = "HP-book" 'Имя SQL сервера
-
Const strDBName As String = "db_DZ_Test" 'Имя базы данных
-
-
'SQL скрипт, если база существует - удаляем, и создаем новую
-
Const strDBNewCreat As String = "DROP DATABASE IF EXISTS " & strDBName & ";" &
-
"create database " & strDBName
-
'SQL скрипт, создаем таблицу
-
Const strTblNew As String = "create table " & strTblName &
-
"( NUMDOC TEXT Not null);"
-
#End Region
-
-
#Region "Переменные"
-
Dim DocXML As New XmlDocument()
-
Dim strFileNameXML As String()
-
#End Region
-
-
-
'Удаляем директорию если есть, и создаем папку для распаковки архива - .\extract
-
If Directory.Exists(strExtractPath) = True Then Directory.Delete(strExtractPath, True)
-
Directory.CreateDirectory(strExtractPath)
-
-
' Распаковка архива
-
Console.WriteLine("Распаковка архива, ожидайте...")
-
ZipFile.ExtractToDirectory(strZipPath, strExtractPath)
-
Console.WriteLine("Распаковка архива закончена.")
-
-
'Получаем имена файлов из распакованного архива согласно маске
-
strFileNameXML = Directory.GetFiles(strExtractPath, mskXmlFile)
-
-
'Загрузка Xml документа согласно маске
-
Console.WriteLine("Загружаю данные, ожидайте...")
-
DocXML.Load(strFileNameXML.First)
-
-
-
'==============================================================================================
-
-
'Формирование списка искомых значений узла
-
-
'==============================================================================================
-
-
Dim xRoot As XmlElement = DocXML.DocumentElement()
-
Dim xAttr As XmlNode
-
-
Console.WriteLine("Обработка данных, ожидайте...")
-
-
For Each xNode As XmlNode In xRoot
-
-
'If xNode.Attributes.Count > 0 Then
-
xAttr = xNode.Attributes.GetNamedItem(strID)
-
' If xAttr IsNot Nothing Then
-
strListNode.Add(xAttr.Value.ToString)
-
' End If
-
'End If
-
Next
-
-
'==============================================================================================
-
-
'SQL
-
-
'==============================================================================================
-
-
'Коннектимся с master и создаем БД
-
Console.WriteLine("Подключаюсь к SQL серверу.")
-
CreateSQLElem(strDBNewCreat, "Server=" & strServerSQL & ";Integrated security=SSPI;database=master", "База данных создана.")
-
'Коннектимся с созданой БД и создаем таблицу
-
CreateSQLElem(strTblNew, "Server=" & strServerSQL & ";Integrated security=SSPI;database=" & strDBName, "Таблица создана.")
-
-
'Вносим данные в таблицу, "параллельный" ввод
-
Console.WriteLine("Экспорт данных в созданную таблицу, ожидайте...")
-
CreateSQLElem("Prl", "Server=" & strServerSQL & ";Integrated security=SSPI;database=" & strDBName, "Данные в БД SQL внесены.")
-
-
End Sub
-
-
Private Sub CreateSQLElem(ScriptSQl As String, strConnConf As String, ConsoleTxt As String) 'Коннектинг с SQL сервером
-
-
Dim myConn As SqlConnection = New SqlConnection(strConnConf)
-
Dim myCommand As SqlCommand = New SqlCommand(ScriptSQl, myConn)
-
-
-
-
If ScriptSQl = "Prl" Then 'Если "Prl" - запускаем "параллельное" заполнение ранее созданной табл.
-
Parallel.ForEach(strListNode, Sub(ToTbl)
-
ScriptSQl = "INSERT INTO " & strTblName & " ( NumDoc ) VALUES('" & ToTbl & "'); "
-
Using myConn1 As SqlConnection = New SqlConnection(strConnConf),
-
myCommand1 As SqlCommand = New SqlCommand(ScriptSQl, myConn1)
-
-
myConn1.Open()
-
myCommand1.ExecuteNonQuery()
-
myConn1.Close()
-
-
End Using
-
End Sub)
-
-
Else ' Если не "Prl" - последовательно создаются БД и Таблица
-
Try
-
myConn.Open()
-
myCommand.ExecuteNonQuery()
-
-
Console.WriteLine(ConsoleTxt)
-
Catch ex As Exception
-
Console.WriteLine(ex.ToString())
-
Console.Read()
-
Finally
-
-
-
End Try
-
If (myConn.State = ConnectionState.Open) Then
-
myConn.Close()
-
End If
-
End If
-
End Sub
-
-
End Module
VB.NET - Скачать исходник