Удалите первые 15 строк из нескольких файлов CSV в одной папке с помощью Powershell - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть скрипт Powershell, который аккуратно удаляет первые 15 строк из одного файла CSV.

$import = get-content c:\temp\test.csv
$import | Select-Object -Skip 15 | Set-Content c:\temp\test2.csv

Я бы хотел пройтись по нескольким файлам CSV в одной папке.Не могу понять, как это сделать.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вот решение для одного конвейера , которое обрабатывает файлы как текстовые файлы и пропускает первые 15 данные строки , т. Е.сохраняет строку заголовка (первая строка в CSV-файле, содержащем имена столбцов), а сохраняет результат для каждого *.csv файла в соответствующий *2.csv файл :

Get-ChildItem c:\temp -Filter *.csv | ForEach-Object {
  Get-Content $_.FullName | 
    Where-Object { $_.ReadCount -eq 1 -or $_.ReadCount -ge 17 } |  
      Set-Content ($_.FullName -replace '\.csv$', '2$&')
}

Примечание. Чтобы безоговорочно удалить первые 15 строк , замените команду Where-Object на:
Select-Object -Skip 15

Обратите внимание на использование свойства .ReadCount, которое содержит номер строки ввода.Get-Content добавляет это свойство к каждой строке, которую оно читает из входного файла.

Обработка файлов CSV в виде текстовых файлов Get-Content / Set-Content, а не Import-Csv / Export-Csv) позволяет ускорить обработку (и сохранить наличие / отсутствие двойных кавычек вокруг значений), но есть предостережение о том, что текстовые строки такие же, как строки CSV : тогда как CSV строка равна обычно так же, как текстовый файл строка , которая не обязательно true: значения столбца CSV, если "..." -замкнут, может охватывать несколько строк .

Также обратите внимание, чтов Windows PowerShell Set-Content по умолчанию создает выходные файлы с кодировкой ANSI независимо от входной кодировки ;в PowerShell Core вы получите файлы без кодировки UTF-8 без спецификации. Используйте -Encoding для управления выходной кодировкой.

0 голосов
/ 01 февраля 2019

Необязательный параметр -NumberOfLines, по умолчанию 15.

Необязательный параметр -Verbose будет выводить измененные файлы.

function Remove-CSVLines {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$FolderPath,

        [int]$NumberOfLines = 15
    )
    process{
        $fileList = (Get-ChildItem -Path $FolderPath -Filter '*.csv')

        foreach ($file in $fileList){
            $csvObject = Import-Csv -Path $file.PSPath
            $csvObject | Select-Object -Property * -Skip $NumberOfLines | Export-CSV -Path $file.PSPath -Force -NoTypeInformation
            Write-Verbose -Message "Removed $NumberOfLines lines from $file"
        }
    }
}

Remove-CSVLines -FolderPath .\myfolder
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...