Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Аватара пользователя
Serg2010

Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Сообщение Serg2010 »

Доброго времени суток!



Господа, помогите, пожалуйста, написать код выполняющий извлечение нужной информации из текстовый файлов в файл Excel.

Ставлю задачу: в текстовые файлы я сохранил данные сертификатов проверки ключей. Их много, в каждом меня интересует, например СНИЛС:, Фамилия:, Должность:, Подразделение:, Организация: и т.д. Т.е. слева название с двоеточием, справа значение. Потом конец строки. Каждое значение с новой строки.

Один такой обработанный файл равен одной строчки в Excel, столбцы соответствуют искомым значениям.

Далее я просто возьму список сотрудников с их должностями и наложу на полученный файл Excel, при разногласии закажу новый сертификат. Типа сверки, глазами это делать рутинно и тяжело.



Спасибо. Думаю идея понятна.
Аватара пользователя
Iska

Re: Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Сообщение Iska »

Serg2010, замечательно. Нам осталось только увидеть образцы этих текстовых файлов и потребной Вам результирующей Рабочей книги Microsoft Excel, упакованных в архив.
Аватара пользователя
YuS_2

Re: Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Сообщение YuS_2 »

если говорить о powershell, то не проще ли напрямую из сертификатов формировать хэштаблицы и оперировать уже этими данными? Хоть в Excel, хоть сразу сравнивать списки...

Тут постановку задачи лучше скорректировать, чем решать её окольными путями...
Аватара пользователя
megaloman

Re: Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Сообщение megaloman »

Цитата:



Далее я просто возьму список сотрудников с их должностями и наложу на полученный файл Excel,



список в бумажном виде ? Изображение Наверное, это тоже таблица и, наверное, в Еxcel. Имхо, логично делать эту операцию (импорт файла и сравнение со списком) макросом в таблице Excel со списком сотрудников. Нужны образцы файлов: список сотрудников, данные сертификатов, в каком виде хотите видеть результат.
Аватара пользователя
v79italya

Re: Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Сообщение v79italya »

Serg2010, это можно сделать в Power Query. будут файлы - можно сказать конкретнее
Аватара пользователя
Iska

Re: Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Сообщение Iska »

Serg2010, попробуйте так (на WSH):

Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

Option Explicit
Const xlContinuous = 1
Const xlThin       = 2
Const xlAutomatic  = &HFFFFEFF7
Dim strSourceFolder
Dim objFSO
Dim objFile
Dim strContent
Dim objRegExp
Dim objExcel
Dim objWorkBook
Dim objRange
If WScript.Arguments.Count = 1 Then
	strSourceFolder = WScript.Arguments.Item(0)
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	If objFSO.FolderExists(strSourceFolder) Then
		Set objRegExp = WScript.CreateObject("VBScript.RegExp")
		With objRegExp
			.IgnoreCase = True
			.MultiLine  = True
			.Pattern = _
				"Серийный номер\r\n" & _
				"-{64}\r\n" & _
				"((?:[\da-f]{2} ){15}[\da-f]{2})\r\n" & _
				"[\s\S]*" & _
				"Субъект\r\n" & _
				"-{64}\r\n" & _
				"СНИЛС: (\d{11})\r\n" & _
				"ОГРН: (\d{13})\r\n" & _
				"ИНН: (\d{12})\r\n" & _
				"Адрес, улица: (.*?)\r\n" & _
				"Отчество: .*?\r\n" & _
				"Фамилия: .*?\r\n" & _
				"Электронная почта: (.*?)\r\n" & _
				"Город: (.*?)\r\n" & _
				"Область: .*?\r\n" & _
				"Страна: .*?\r\n" & _
				"Должность: (.*?)\r\n" & _
				"Подразделение: (.*?)\r\n" & _
				"Организация: (.*?)\r\n" & _
				"Имя: (.*?)\r\n"
		End With
		Set objExcel    = WScript.CreateObject("Excel.Application")
		Set objWorkBook = objExcel.Workbooks.Add()
		Set objRange    = objWorkBook.Worksheets.Item(1).Range("A1").Resize(1, 11)
		With objRange
			.NumberFormat = "@"
			.Value = Array( _
						"Серийный номер-19", _
						"СНИЛС-48", _
						"ОГРН-49", _
						"ИНН-50", _
						"Адрес, улица-51", _
						"Электронная почта-54", _
						"Город-55", _
						"Должность-58", _
						"Подразделение-59", _
						"Организация-60", _
						"Имя-61" _
					)
		End With
		For Each objFile In objFSO.GetFolder(strSourceFolder).Files
			If StrComp(objFSO.GetExtensionName(objFile.Name), "txt", 0) = 0 Then
				With objFSO.OpenTextFile(objFile.Path)
					strContent = .ReadAll()
					.Close
				End With
				Set objRange = objRange.Offset(1, 0)
				If objRegExp.Test(strContent) Then
					With objRange
						.NumberFormat = "@"
						.Value = Collection2Array(objRegExp.Execute(strContent).Item(0).Submatches)
					End With
				Else
					WScript.Echo "Can't determine pattern in file [" & objFile.Name & "] correctly."
					With objRange
						.NumberFormat = "@"
						.Value = "Error while parsing file [" & objFile.Name & "]"
					End With
				End If
			Else
				' Nothing to do
			End If
		Next
		With objRange.Parent.UsedRange
			With .Borders
				.LineStyle  = xlContinuous
				.Weight     = xlThin
				.ColorIndex = xlAutomatic
			End With
			.Columns.AutoFit
		End With
		objExcel.Visible = True
		Set objRange    = Nothing
		Set objWorkBook = Nothing
		Set objExcel    = Nothing
		Set objRegExp   = Nothing
	Else
		WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
		WScript.Quit 2
	End If
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ "
	WScript.Quit 1
End If
WScript.Quit 0
'-----------------------------------------------------------------------------
'-----------------------------------------------------------------------------
Function Collection2Array(objCollection)
	ReDim arrArray(objCollection.Count - 1)
	Dim i
	For i = LBound(arrArray) To UBound(arrArray)
		arrArray(i) = objCollection(i)
	Next
	Collection2Array = arrArray
End Function
'-----------------------------------------------------------------------------


Путь к целевому каталогу задаётся аргументом скрипта (также можно просто перетянуть папку на скрипт в Проводнике). Если указанный каталог существует, в нём перебираются все текстовые файлы, внутри каждого из которых делается попытка выделения искомых значений по заданному шаблону. При удачном соответствии строка в новосозданной Рабочей книге Microsoft Excel заполняется найденными соответствиями. Поскольку предназначено для ручной работы — сохранение Рабочей книги оставил Вам на откуп.

P.S. См. также
Разбираем квалифицированные сертификаты X.509 в поисках ИНН, СНИЛС и ОГРН / Хабр
.
Аватара пользователя
DJ Mogarych

Re: Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Сообщение DJ Mogarych »

Код:

Код: Выделить всё

$src = gc "C:\temp\Пример обработки сертификата\Петров Иван Иванович.txt"
[array]$data = (($src |select -Skip 16 -First 3) -replace '-{2,}',': ') -join ''
$data += $src |select -Skip 47 -First 15

Получается такой формат:

Код:

Код: Выделить всё

Серийный номер: 01 D1 1D 91 2F 01 1D 10 00 00 A5 35 21 B1 01 46
СНИЛС: 33333333333
ОГРН: 4444444444444
ИНН: 555555555555
Адрес, улица: пр. Ленина, 1
Отчество: Иван Иванович
Фамилия: Петров
Электронная почта: abc@xyz.ru
Город: Мирный
Область: 11 Прекрасная область
Страна: RU
Должность: начальник отдела
Подразделение: финансовый отдел
Организация: ООО "Цветочки"
Имя: Петров Иван Иванович

Но хоть убей не понимаю, как из этого сделать табличку csv, что-то затупил. Как из первого слова сделать свойство?
Аватара пользователя
v79italya

Re: Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Сообщение v79italya »

Serg2010, попробуйте вариант в Power Query. Для обновления данных нажмите Ctrl+Alt+F5
Ответить

Вернуться в «Скриптовые языки администрирования Windows»