Автоматическое изменение файла .csv в powershell

#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. Спасибо, это то, что я искал! 🙂