Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

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

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Спасибо. Думаю идея понятна.

Отправлено: 22:54, 05-10-2019

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:08, 12-10-2019 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


YuS_2, скажу больше: достаточно отображения в памяти. Хотя для изобретения велосипеда можно конвертировать и в хэш, однако эффективнее оперировать адресами в памяти, особенно если список сотрудников овердофига. Можно вообще скорее всего задачу решить по типу SQL запросов. Как бы там ни было, Serg2010 усиленно зарабатывает себе статью, пытаясь перекладывать свои проблемы госслужащего на плечи форумных айтишников, сливая интересную информацию (пусть и шаблонного вида).

Отправлено: 23:36, 12-10-2019 | #12


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата greg zakharov:
однако эффективнее оперировать адресами в памяти »
Ну, не каждому по силам писать "скрипты" на ассемблере...
Тут, что-нибудь попроще бы...
Цитата greg zakharov:
сливая интересную информацию »
Да какая там интересная информация... сертификатов в сети можно найти множество, да и нет там ничего секретного, кроме, собственно, личных данных...

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:52, 13-10-2019 | #13


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


YuS_2, работая в одном из госучреждений, пришлось столкнуться с очень неприятной вещью: подделанные сертификаты. Расследование инцидента вывело на сотрудника, публиковавшего шаблоны данных на форумах с просьбой аналогичной заявленной автором темы. Казалось бы, ничего интересного в примерах нет, но люди сведущие и из этого могут вынести для себя много пользы. И если быть предельно объективным, окажись страна в состоянии кибервойны с какой-либо из развитых технологически стран, последняя одержит вверх, так как более 50% полезной информации лежит в открытом доступе в сети. БД налогоплптельщиков - пожалуйста, данные паспортных столов - нате, данные по медсистеме БАРС - не вопрос. ГосУслуги и вовсе радуют, но там и инфраструктура гнилая начиная с самих сотрудников. А вы говорите ничего интересного... Да, пожалуй, стоит признать свою неправоту перед компетентностью не работавших в госсекторе. В общем, вы правы, дерзайте.

Отправлено: 12:00, 13-10-2019 | #14


Ветеран


Contributor


Сообщения: 2706
Благодарности: 1684

Профиль | Отправить 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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


greg zakharov, вы не дочитали до конца.
Цитата DJ Mogarych:
Как из первого слова сделать свойство? »

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 22:00, 13-10-2019 | #16


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


DJ Mogarych, что вы разумеете под свойством? Что вы желаете получить?

Отправлено: 23:17, 13-10-2019 | #17


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Чтобы первое слово (до двоеточия) было названием столбца, а второе - значением.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 08:47, 14-10-2019 | #18


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить 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 }
}
можно вместо регулярки просто split использовать

но лучше бы топикстартер и не пытался делать этот шаг:
Цитата:
в текстовые файлы я сохранил данные сертификатов проверки ключей
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:36, 14-10-2019 | #19


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Busla, какой ужас.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 20:13, 14-10-2019 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Импорт данные из текстового файла (*.txt) в таблицу Excel

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход