Что нового

[Данные, строки] Экспорт из DBF в XML

GitoKorol

Новичок
Сообщения
5
Репутация
0
Версия AutoIt: 3.3.8.1

Описание: Имеется DBF файл с примерной структурой:
Код:
Столбец1 Столбец2 Столбец3
1-------- a-------- а--------
2-------- b-------- б--------
3-------- c-------- в--------


необходимо конвертировать в XML в виде:
Код:
<Field>
         <Stolbec1>Столбец1</Stolbec1>
      </Field>
      <Field>
         <Stolbec2>Столбец2</Stolbec2>
      </Field>
      <Field>
         <Stolbec3>Столбец3</Stolbec3>
      </Field>
      <Record>
         <1>1-------- </1>
         <2>2--------</2>
         <3>3--------</3>
      </Record>
      <Record>
         <a>a-------- </a>
         <b>b--------</b>
         <c>c--------</c>
      </Record>
      <Record>
         <ra>a-------- </ra>
         <rb>б--------</rb>
         <rv>в--------</rv>
      </Record>

Примечания:
Необходима поддержка кириллицы.

:IL_AutoIt_1:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
GitoKorol,
Попробуйте примерно так.
Код:
Opt('MustDeclareVars', 1)

Local $s_Text, $a_Split, $i_Column, $a_Tag[2] = ['Field', 'Record'], $s_Tag_ru = 'ru_', $s_Tag_num = 'num_', $s_Tag, $s_Tab, _
		$s_XML = '<?xml version="1.0" encoding="utf-8"?>' & @CRLF & '<Content>' & @CRLF, $s_EndXML = '</Content>', _
		$s_FileXML = @ScriptDir & '\test.xml', $h_File, $s_Tmp, $s_FileDBF = @ScriptDir & '\file.dbf'

If Not FileExists($s_FileDBF) Then Exit 13
$s_Text = FileRead($s_FileDBF)
$s_Text = StringRegExpReplace($s_Text, '((^[\r\n]*)|([\r\n]*$))', '')
$i_Column = UBound(StringSplit(StringLeft($s_Text, StringInStr($s_Text, @CRLF)), ' ', 2))
If Not $i_Column Then Exit 13
$a_Split = StringSplit(StringStripCR($s_Text), ' ' & @LF)
If @error Then Exit 13
If Mod($a_Split[0], $i_Column) Then Exit 13
$s_Text = ''
For $i = 1 To UBound($a_Tag)
	$s_Tab &= @TAB
Next
For $i = 1 To $i_Column
	$s_XML &= @TAB & '<' & $a_Tag[0] & '>' & @CRLF
	$s_Tmp = $a_Split[$i]
	If StringRegExp($s_Tmp, '[ЁёА-Яа-я]') Then $s_Tmp = _Translit($s_Tmp)
	$s_XML &= $s_Tab & '<' & $s_Tmp & '>' & $a_Split[$i] & '</' & $s_Tmp & '>' & @CRLF
	$s_XML &= @TAB & '</' & $a_Tag[0] & '>' & @CRLF
Next
For $j = 1 To $i_Column
	$s_XML &= @TAB & '<' & $a_Tag[1] & '>' & @CRLF
	For $i = $i_Column + $j To $a_Split[0] Step $i_Column
		$s_Tmp = StringLeft($a_Split[$i], 1)
		If StringIsDigit($s_Tmp) Then $s_Tmp = $s_Tag_num & $s_Tmp
		If StringRegExp($s_Tmp, '[ЁёА-Яа-я]') Then $s_Tmp = $s_Tag_ru & _Translit($s_Tmp)
		$s_XML &= $s_Tab & '<' & $s_Tmp & '>' & $a_Split[$i] & '</' & $s_Tmp & '>' & @CRLF
	Next
	$s_XML &= @TAB & '</' & $a_Tag[1] & '>' & @CRLF
Next
$s_XML &= $s_EndXML
$h_File = FileOpen($s_FileXML, 256 + 2)
FileWrite($h_File, $s_XML)
FileClose($h_File)
ShellExecute($s_FileXML)

Func _Translit($s_Text)
	Local $a_Translit[67][2] = [[66],['а', 'a'],['б', 'b'],['в', 'v'],['г', 'g'],['д', 'd'],['е', 'e'],['ё', 'yo'],['ж', 'zh'],['з', 'z'],['и', 'i'], _
			['й', 'j'],['к', 'k'],['л', 'l'],['м', 'm'],['н', 'n'],['о', 'o'],['п', 'p'],['р', 'r'],['с', 's'],['т', 't'], _
			['у', 'u'],['ф', 'f'],['х', 'h'],['ц', 'tc'],['ч', 'ch'],['ш', 'sh'],['щ', 'shch'],['ъ', "'"],['ы', 'i'],['ь', ''], _
			['э', 'e`'],['ю', 'yu'],['я', 'ya'],['А', 'A'],['Б', 'B'],['В', 'V'],['Г', 'G'],['Д', 'D'],['Е', 'E'],['Ё', 'Yo'],['Ж', 'Zh'],['З', 'Z'],['И', 'I'], _
			['Й', 'J'],['К', 'K'],['Л', 'L'],['М', 'M'],['Н', 'N'],['О', 'O'],['П', 'P'],['Р', 'R'],['С', 'S'],['Т', 'T'], _
			['У', 'U'],['Ф', 'F'],['Х', 'H'],['Ц', 'Tc'],['Ч', 'Ch'],['Ш', 'Sh'],['Щ', 'Shch'],['Ъ', "'"],['Ы', 'I'],['Ь', ''], _
			['Э', 'E`'],['Ю', 'Yu'],['Я', 'Ya']]

	For $i = 1 To $a_Translit[0][0]
		$s_Text = StringReplace($s_Text, $a_Translit[$i][0], $a_Translit[$i][1], 0, 1)
	Next
	Return $s_Text
EndFunc   ;==>_Translit
Немного поправил код. Обязательное условие для исходного файла - кол-во столбцов в каждой строке (разделенных пробелом) должно быть одинаковое. Если надо, могу сделать, чтобы кол-во столбцов со второй строки и до конца могло быть меньше или равно кол-ву их в первой строке.
 
Верх