|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel |
|
Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel
|
Пользователь Сообщения: 84 |
Доброго времени суток!
Господа, помогите, пожалуйста, написать код выполняющий извлечение нужной информации из текстовый файлов в файл Excel. Ставлю задачу: в текстовые файлы я сохранил данные сертификатов проверки ключей. Их много, в каждом меня интересует, например СНИЛС:, Фамилия:, Должность:, Подразделение:, Организация: и т.д. Т.е. слева название с двоеточием, справа значение. Потом конец строки. Каждое значение с новой строки. Один такой обработанный файл равен одной строчки в Excel, столбцы соответствуют искомым значениям. Далее я просто возьму список сотрудников с их должностями и наложу на полученный файл Excel, при разногласии закажу новый сертификат. Типа сверки, глазами это делать рутинно и тяжело. Спасибо. Думаю идея понятна. |
|
Отправлено: 22:54, 05-10-2019 |
Crazy Сообщения: 1227
|
Профиль | Отправить PM | Цитировать если говорить о powershell, то не проще ли напрямую из сертификатов формировать хэштаблицы и оперировать уже этими данными? Хоть в Excel, хоть сразу сравнивать списки...
Тут постановку задачи лучше скорректировать, чем решать её окольными путями... |
------- Отправлено: 22:08, 12-10-2019 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Забанен Сообщения: 793
|
YuS_2, скажу больше: достаточно отображения в памяти. Хотя для изобретения велосипеда можно конвертировать и в хэш, однако эффективнее оперировать адресами в памяти, особенно если список сотрудников овердофига. Можно вообще скорее всего задачу решить по типу SQL запросов. Как бы там ни было, Serg2010 усиленно зарабатывает себе статью, пытаясь перекладывать свои проблемы госслужащего на плечи форумных айтишников, сливая интересную информацию (пусть и шаблонного вида).
|
Отправлено: 23:36, 12-10-2019 | #12 |
Crazy Сообщения: 1227
|
Профиль | Отправить PM | Цитировать Цитата greg zakharov:
![]() Тут, что-нибудь попроще бы... Цитата greg zakharov:
|
||
------- Отправлено: 09:52, 13-10-2019 | #13 |
Забанен Сообщения: 793
|
YuS_2, работая в одном из госучреждений, пришлось столкнуться с очень неприятной вещью: подделанные сертификаты. Расследование инцидента вывело на сотрудника, публиковавшего шаблоны данных на форумах с просьбой аналогичной заявленной автором темы. Казалось бы, ничего интересного в примерах нет, но люди сведущие и из этого могут вынести для себя много пользы. И если быть предельно объективным, окажись страна в состоянии кибервойны с какой-либо из развитых технологически стран, последняя одержит вверх, так как более 50% полезной информации лежит в открытом доступе в сети. БД налогоплптельщиков - пожалуйста, данные паспортных столов - нате, данные по медсистеме БАРС - не вопрос. ГосУслуги и вовсе радуют, но там и инфраструктура гнилая начиная с самих сотрудников. А вы говорите ничего интересного... Да, пожалуй, стоит признать свою неправоту перед компетентностью не работавших в госсекторе. В общем, вы правы, дерзайте.
|
Отправлено: 12:00, 13-10-2019 | #14 |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать Еще один вариант vbs. Можно обработать как отдельный файл, так и папку с файлами.
InName = "Z:\Soft_Arc\Пример обработки сертификата" ' Путь обрабатываемой папки, если он не передаётся в аргументе 'InName = "Z:\Soft_Arc\Пример обработки сертификата\Петров Иван Иванович.txt" ' Путь обрабатываемого файла, если он не передаётся в аргументе With WScript.Arguments If .Count <> 0 Then InName = .Item(0) End If End With Set FSO = CreateObject("Scripting.FileSystemObject") Look = 0 If (FSO.FolderExists(InName)) Then Look = 1 If (FSO.FileExists(InName)) Then Look = 2 If Look = 0 Then MsgBox "Not found:" + vbCrLf + vbCrLf + InName, 16, "Error" WScript.Quit 1 End If Ext = "txt" ' Расширение файлов при обработке папки R1 = "B3" ' Начало заголовка генерируемой таблицы ' Перечисление параметров в заголовке Param = Array("Имя файла", _ "Серийный номер", _ "СНИЛС", _ "ОГРН", _ "ИНН", _ "Адрес, улица", _ "Электронная почта", _ "Город", _ "Должность", _ "Подразделение", _ "Организация", _ "Имя") N0 = LBound(Param) NN = UBound(Param) Set XL = CreateObject("Excel.Application") XL.Visible = True XL.Workbooks.Add Call HeadLine(XL, R1, Param, N0, NN) ii = 0 If Look = 2 Then Call InTable(XL, R1, Param, N0, NN, FSO, InName, ii) Else On Error Resume Next LErr = 0 With FSO.GetFolder(InName) LErr = Not Err.Number <> 0 If Not LErr Then MsgBox "Error open folder " + vbCrLf + vbCrLf + InName + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description, 16, "Error" WScript.Quit 1 Else For Each InFile In .Files If LCase(Ext) = LCase(FSO.GetExtensionName(InFile)) Then Call InTable(XL, R1, Param, N0, NN, FSO, InFile, ii) Next End If End With On Error GoTo 0 End If XL.Columns(Replace(XL.Range(R1).Address, "$" + CStr(XL.Range(R1).Row), ":") + Replace(XL.Range(R1).Offset(0, NN - N0).Address, "$" + CStr(XL.Range(R1).Row), "")).EntireColumn.AutoFit Sub HeadLine(XL, R1, Param, N0, NN) ' ---- Формируем заголовок таблицы For i = N0 To NN With XL.Range(R1).Offset(0, i - N0) .Formula = Param(i) .HorizontalAlignment = -4108 .VerticalAlignment = -4108 .Font.FontStyle = "полужирный" .Borders(7).Weight = -4138 .Borders(8).Weight = -4138 .Borders(9).Weight = -4138 .Borders(10).Weight = -4138 End With Next End Sub Sub InTable(XL, R1, Param, N0, NN, FSO, InName, ii) ' ---- Содержимое файла помещаем в строку таблицы On Error Resume Next LErr = 0 With FSO.OpenTextFile(InName, 1) LErr = Not Err.Number <> 0 If Not LErr Then MsgBox "Error open file " + vbCrLf + vbCrLf + InName + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description Exit Sub Else InTxt = .ReadAll LErr = Not Err.Number <> 0 If Not LErr Then MsgBox "Error read file " + vbCrLf + vbCrLf + InName + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description Exit Sub End If End If .Close End With On Error GoTo 0 j1 = InStr(1, InTxt, vbCrLf + Param(N0 + 1)) If j1 > 0 Then j1 = InStr(j1 + 1, InTxt, vbCrLf) j1 = InStr(j1 + 1, InTxt, vbCrLf) + 2 j2 = InStr(j1, InTxt, vbCrLf) jj1 = InStr(j2, InTxt, vbCrLf + "Субъект") jj1 = InStr(jj1 + 1, InTxt, vbCrLf) jj1 = InStr(jj1 + 1, InTxt, vbCrLf) + 2 jj2 = InStr(jj1, InTxt, vbCrLf + "-------") ii = ii + 1 With XL.Range(R1) .Offset(ii, 0) = FSO.GetFileName(InName) .Offset(ii, 1) = Trim(Mid(InTxt, j1, j2 - j1 + 1)) InTxt = Mid(InTxt, jj1, jj2 - jj1 + 1) For i = N0 + 2 To NN j1 = InStr(1, InTxt, Param(i) + ":") If j1 <> 0 Then j1 = InStr(j1, InTxt, ":") j2 = InStr(j1, InTxt, vbCrLf) .Offset(ii, i - N0) = Mid(InTxt, j1 + 1, j2 - j1) End If Next End With End If End Sub Я счёл необходимым добавить в Excel-таблицу поле с именем файла. |
------- Последний раз редактировалось megaloman, 13-10-2019 в 22:45. Отправлено: 15:24, 13-10-2019 | #15 |
fascinating rhythm Сообщения: 6654
|
Профиль | Отправить PM | Цитировать greg zakharov, вы не дочитали до конца.
Цитата DJ Mogarych:
|
|
------- Отправлено: 22:00, 13-10-2019 | #16 |
Забанен Сообщения: 793
|
DJ Mogarych, что вы разумеете под свойством? Что вы желаете получить?
|
Отправлено: 23:17, 13-10-2019 | #17 |
fascinating rhythm Сообщения: 6654
|
Профиль | Отправить PM | Цитировать Чтобы первое слово (до двоеточия) было названием столбца, а второе - значением.
|
------- Отправлено: 08:47, 14-10-2019 | #18 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать DJ Mogarych, примерно так:
$data = @' Серийный номер: 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 Должность: начальник отдела Подразделение: финансовый отдел Организация: ООО "Цветочки" Имя: Петров Иван Иванович '@ $data -split "`n" | .{ begin { $resultHashTable = @{} } process { $_ -match '(?<name>[^:]*):(?<value>.*)' | Out-Null ; $resultHashTable[$Matches['name']] = $Matches['value'] } end { [PSCustomObject]$resultHashTable } } но лучше бы топикстартер и не пытался делать этот шаг: Цитата:
|
|
Отправлено: 11:36, 14-10-2019 | #19 |
fascinating rhythm Сообщения: 6654
|
Профиль | Отправить PM | Цитировать Busla, какой ужас.
![]() |
------- Отправлено: 20:13, 14-10-2019 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - Свести в одну таблицу Excel данные из нескольких | skorbut | Скриптовые языки администрирования Windows | 1 | 21-02-2017 17:42 | |
VBS/WSH/JS - Импорт данных в форму Excel из xml файла | VictorST | Скриптовые языки администрирования Windows | 2 | 28-06-2015 12:52 | |
CMD/BAT - Сборка текстового файла из содержимого другого текстового файла | icomboy | Скриптовые языки администрирования Windows | 0 | 10-09-2013 15:17 | |
[решено] Вытащить ячейку из Excel файла и вставить в TXT файл | garanov | AutoIt | 2 | 23-05-2012 14:16 | |
Неправильно отображаются данные при вводе их из текстового файла! | Sox | Программирование и базы данных | 3 | 08-03-2006 17:23 |
|