February 2, 2024
Пример парсинга .CSV (на самом деле .XLS)
Так получилось, что приложение которое выдавало лог имело в выводе XLS формат, а для него нужно городить (на мой взгляд) какой то витиеватый код или устанавливать дополнительный модуль ImportExcel
Парсить мы будем CSV - файл, это удобнее и гибче. По этому сначала откроем XLS файл в Excel и сохраним этот файл как CSV при помощи PowerShell:
# Создадим Excel Application Object $Excel = New-Object -ComObject Excel.Application # откроем файл xls $Workbook = $Excel.Workbooks.Open($logsource) # Сохраним как csv $Workbook.SaveAs($file, 6) # Закрываем книгу и выходим $workbook.Close() $Excel.Quit()
Теперь продолжим работать с CSV файлом, нам нужно найти кого то кто буквально хоть "что-то" сделал:
# Создадим новый обжэкт для csv $name = new-object System.IO.StreamReader($file) $text = (new-object System.IO.StreamReader($file) -OutVariable $name).ReadLine();$name.Clos e()
Проведем манипуляции с данными:
# Получаем данные, указываем разделитель столбцов ;, -like неполное совпадение $data = Get-Content -Path $file | ConvertFrom-Csv -Delimiter ";" # Указываем like и значение $operation = $data | where {$_.Операция -like "*что-то*"} $complete = $data | where {$_.Операция -like "*что-то*"}
# Выберем первую строку $operation.Фамилия | Select-Object -First 1 | Format-Table
# выведем все строки с совпадающим значениями полностью $complete | Format-Table
Остановим выполнение скрипта до ввода значения
Read-Host -Prompt "Для ВЫХОДА нажмите клавишу ВВОД.."
Поскольку таблицы бывают с заголовком и отступом строк, например как здесь:
Пропустим первые 2 строки, укажем разделитель столбцов ";"
$data = Get-Content -Path $file | Select-Object -Skip 2 | ConvertFrom-Csv -Delimiter ";"
Прочитаем первую строку файла в переменную, и заменим запятые
$top = [regex]::Replace($text, "[;]", "")
<# *** Парсим CSV - XLS Alexander Kucherov (с) 2024 t.me/PS_Crutch *** #> # Зададим переменные для файлов $logsource = "$PSScriptRoot\File.xlsx" # Он же парсируемый файл $file= "$PSScriptRoot\File.csv" # Создадим Excel Application Object $Excel = New-Object -ComObject Excel.Application # откроем файл xls $Workbook = $Excel.Workbooks.Open($logsource) # Сохраним как csv $Workbook.SaveAs($file, 6) # Закрываем книгу и выходим $workbook.Close() $Excel.Quit() # Создадим новый обжэкт для csv $name = new-object System.IO.StreamReader($file) # Прочитаем первую линию $text = (new-object System.IO.StreamReader($file) -OutVariable $name).ReadLine();$name.Close() # Получаем первую строку парсируемого файла как txt и заменяем в ней значения пробелами $top = [regex]::Replace($text, "[;]", "") # Получаем содержимое файла и пропускаем вторую строку (ибо там заголовок с номером рейса) # Указываем разделитель столбцов ; $data = Get-Content -Path $file | Select-Object -Skip 2 | ConvertFrom-Csv -Delimiter ";" # Указываем like и значение $operation = $data | where {$_.Операция -like "*что-то*"} $complete = $data | where {$_.Операция -like "*что-то*"} # Очистим экран Clear-Host # Красиво выведем первую строку Write-Host "`n" Write-Host " $top "-ForegroundColor Cyan Write-Host " Фамилии господ (первая и последняя): "-ForegroundColor Cyan Write-Host "`n" # Покажем только столбец Фамилия # Выберем первую и последнюю строки результатов $operation.Фамилия | Select-Object -First 1 | Format-Table $operation.Фамилия | Select-Object -Last 1 | Format-Table Read-Host -Prompt "Для продолжения нажмите клавишу ВВОД.." Write-Host "`n" Write-Host " Все что-то сделавшие господа, все столбцы. "-ForegroundColor Cyan Write-Host "`n" # выведем все строки с совпадающим значениями полностью $complete | Format-Table Write-Host "`n" Write-Host " Все молодцы. "-ForegroundColor Cyan Write-Host "`n" # выведем все строки $data | Format-Table Read-Host -Prompt "Для ВЫХОДА нажмите клавишу ВВОД.." Read-Host -Prompt "Для ВЫХОДА нажмите клавишу ВВОД.."
;Clinic Report; ;; Фамилия;Время;Операция Кляузов;10:22;пошел что-то делать Профессионалов;15:56;обход Тестский;16:16;проспал что-то Помогальский;19:35;восход Пупскый;22:35;уход Господский;23:10;приход Авторитетский;23:58;что-то отремонтировал