#powershell #export-to-csv
#powershell #экспорт в csv
Вопрос:
Я пытаюсь создать сценарий powershell, чтобы выполнить несколько шагов:
- В определенную папку я помещаю файл .xlsx, он преобразует его в csv. До сих пор я получал это:
$ErrorActionPreference = 'Stop'
Function Convert-CsvInBatch
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true)][String]$Folder
)
$ExcelFiles = Get-ChildItem -Path $Folder -Filter *.xlsx -Recurse
$excelApp = New-Object -ComObject Excel.Application
$excelApp.DisplayAlerts = $false
$ExcelFiles | ForEach-Object {
$workbook = $excelApp.Workbooks.Open($_.FullName)
$csvFilePath = $_.FullName -replace ".xlsx$", ".csv"
$workbook.SaveAs($csvFilePath, [Microsoft.Office.Interop.Excel.XlFileFormat]::xlCSV)
$workbook.Close()
}
# Release Excel Com Object resource
$excelApp.Workbooks.Close()
$excelApp.Visible = $true
Start-Sleep 5
$excelApp.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelApp) | Out-Null
}
#
# 0. Prepare the folder path which contains all excel files
$FolderPath = "C:exacthpath"
Convert-CsvInBatch -Folder $FolderPath
- Столбцы в файле все еще существуют, поэтому я хочу удалить их и вставить ‘;’ вместо этого, например:
H;1;43;185;
На данный момент я застрял. Я могу импортировать его в Powershell следующим образом:
Import-Csv -Path 'C:folderfilename.csv' | ForEach-Object {
$_
}
Я получаю этот вид, и самая важная задача находится здесь, только в первой строке:
H;1;43;185;
Это должно быть изменено на:
H;01;43;185
остальное следует оставить нетронутым. После того, как мне нужно экспортировать его обратно в файл CSV, например:
Export-Csv -Path 'C:foldermodified_filename.csv'
Но весь этот процесс должен быть вставлен в один скрипт powershell, который выполняет вышеуказанные шаги самостоятельно. Итак, вкратце:
- определяет любой файл .xlsx — независимо от его имени
- преобразует его в .csv
- изменяет внешний вид документа, разделяя столбцы символом «;»
- измените первую строку, чтобы в ней было ‘H; 01; 43; 185’ — это статическая строка, она всегда будет выглядеть так
- сохраните созданный файл как конечный файл .csv
Можете ли вы как-то помочь мне включить / оптимизировать вышеупомянутые сценарии и позволить powershell также выполнить модификацию? Пример содержимого файла, подобного этому (окончательный вид) Обычно он включает более 1000 строк:
H;01;43;185
D;111;3;1042;2
D;222;3;1055;3
D;333;3;1085;1
T;3;;;
Любая помощь приветствуется.
С уважением, Армин
Комментарии:
1. Первое, что приходит мне в голову, это то, что, я думаю, вас заинтересует отличный модуль ImportExcel . COM-интерфейс Excel работает медленно
2. Какой символ-разделитель фактически используется, когда ваш Excel создает CSV? Это запятая или точка с запятой (
;
). Если это точка с запятой, выImport-Csv -Path 'C:folderfilename.csv'
не будете работать, потому что без-Delimiter ';'
нее все строки будут импортированы как один столбец. Какова логика использования заголовка,'H;01;43;185
когда, по-видимому, данные в файле содержат 5 столбцов, а не только эти четыре.3. @Theo Символом-разделителем для меня является точка с запятой, такая же, как в примерах. И да, изначально это документ из 5 столбцов, но в первой строке необходимо удалить точку с запятой в 5-м столбце, иначе программа, которая должна импортировать этот файл, не распознает его.
4. @GertJanKraaijeveld, я пробую этот способ, но поскольку компьютер является офисным, мне нужны права администратора для выполнения этого. Мы будем продавать…
5. Проверьте свой
$env:PSModulePath
. Возможно, он содержит путь в вашей личной домашней папке / папке профиля. Вы можете размещать там модули как пользователь
Ответ №1:
Если, как вы говорите в своем комментарии, ваш Excel уже создает csv с точкой с запятой в качестве разделителя, вы можете сделать это внутри цикла, чуть ниже $workbook.Close()
# read the file created by Excel as string array
$data = Get-Content $csvFilePath
# overwrite the file with just the new header
Set-Content -Path $csvFilePath -Value 'H;01;43;185'
# add the rest of the data to the file
$data[1..($data.Count -1)] | Add-Content -Path $csvFilePath
PS Я бы удалил строки
$excelApp.Visible = $true
Start-Sleep 5
потому что я не вижу необходимости показывать Excel и приостанавливать функцию на 5 секунд.. Вместо этого Excel вообще не отображается, поэтому он будет работать намного быстрее, если добавить
$excelApp.Visible = $false
сразу после создания $excelApp
Комментарии:
1. Спасибо, это то, что я искал! 🙂