February 2, 2024

Пример парсинга .CSV (на самом деле .XLS)

https://t.me/PS_crutch

Изврат? Конечно!

Так получилось, что приложение которое выдавало лог имело в выводе 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 "Для ВЫХОДА нажмите клавишу ВВОД.."

Поскольку таблицы бывают с заголовком и отступом строк, например как здесь:

Строки 1 и 2

Пропустим первые 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 "Для ВЫХОДА нажмите клавишу ВВОД.."
 

Вид CSV:

;Clinic Report;
;;
Фамилия;Время;Операция
Кляузов;10:22;пошел что-то делать
Профессионалов;15:56;обход
Тестский;16:16;проспал что-то
Помогальский;19:35;восход
Пупскый;22:35;уход
Господский;23:10;приход
Авторитетский;23:58;что-то отремонтировал

Выполним код:

наш код в файле parse.ps1

Фамилии господ
Прочая выдача