Извлеките только первые 10 строк CSV-файла в PowerShell из 30 разных файлов в папке - PullRequest
0 голосов
/ 04 февраля 2019

У меня более 300 файлов .csv в папке (папка A), содержащей информацию о компьютере (имя машины, размер HD, память и т. Д.), Все в отдельных строках.Заголовки - это Item и Value.

Мне нужно извлечь первые 25 строк из каждого файла в папке и поместить его в один CSV-файл.

Get-Content "C:\folder\A\*.csv" | select -First 25 | Out-file "C:\folder\B\.csv" 

Это отлично работает, но как мне заставить его работать для всех файлов в папке A?

Ответы [ 2 ]

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

Если ваши 30/300?CSV-файлы содержат 10/25?имя, пары значений,
объединение их в один CSV-файл не имеет большого смысла;
, если они не являются однородными и уникальными и, таким образом,
могут рассматриваться как хеш-таблица и преобразовываться как входные данные в [PSCustomObject]

Таким образом, если ваш ввод csv выглядит следующим образом:

|PCone.csv           |PCtwo.csv           |PChree.csv          |
+--------------------+--------------------+--------------------+
|item,value          |item,value          |item,value          |
|machine name,PCone  |machine name,PCtwo  |machine name,PCthree|
|HD size,250GB       |HD size,1TB         |HD size,1TB         |
|memory,8192         |memory,16384        |memory,16384        |

этот скрипт:

## Q:\Test\2019\02\05\SO_54523916.ps1
$Columns = @("machine name","HD size","memory")

$AllCsv = foreach($csv in Get-ChildItem pc*.csv){
    [pscustomobject](ConvertFrom-StringData -StringData (
                     (Get-Content $Csv -raw) -replace ',', "="))
}

$AllCsv | Select-Object $Columns

дает такой вывод:

machine name HD size memory
------------ ------- ------
PCone        250GB   8192
PCthree      1TB     16384
PCtwo        1TB     16384
0 голосов
/ 05 февраля 2019
# The single output file.
$outFile = 'C:\folder\B.csv'

# Get all input CSV files as an array of file-info objects.
$inFiles = @(Get-ChildItem C:\folder -Filter A*.csv)

# How many *data* rows to extract from each input CSV
$count = 25

# Extract the header line (column names) from the first input file
# and write it to the output file.
Get-Content $inFiles[0] -First 1 | Set-Content -Encoding Utf8 $outFile

# Process all input files and append their first 25 *data* rows to the
# output file.
foreach ($file in $inFiles) {
  Get-Content $_.FullName -First ($count+1) | Select-Object -Skip 1 | 
    Set-Content -Append -Encoding Utf8 $outFile 
}

Обратите внимание на использование -Encoding Utf8 в качестве примера;отрегулируйте по мере необходимости;по умолчанию Set-Content будет использовать кодировку "ANSI" в Windows PowerShell и без спецификации UTF-8 в PowerShell Core .

Предупреждение :Выполняя построчную обработку простого текста, вы полагаетесь на каждую текстовую строку , представляющую одну CSV строку данных ;это обычно true, но не обязательно.

Альтернативой является использование Import-Csv и Export-Csv для обработки файлов, но это (a) требует значительной обработкинакладные расходы и (b) неизменно заключают в двойные кавычки все значения столбцов, даже если они не были изначально (хотя обычно это не имеет значения).

При этом Import-Csv и Export-Csv, безусловно, лучший выборвсякий раз, когда вам нужно читать и интерпретировать данные (в отличие от простого копирования их в другом месте).

И наоборот, если производительность имеет первостепенное значение, описанный выше простой текстовый подход может быть значительно ускорен спрямое использование методов .NET, таких как [IO.File]::ReadLines() или, если файлы достаточно малы, даже [IO.File]::ReadAllLines().


Что касается то, что вы пытались :

Get-Content "C:\folder\A*.csv" | select -First 25

Это не извлекает 25 строк из каждого файла, он собирает строкииз всех файлов, которые соответствуют шаблону (A*.csv), а затем извлекают одиночный 25-элементный срез с начала.

Дополнительно, для вывода в одиночный CSV-файл вывода:

  • Вы должны убедиться, что в выходной файл записана только одна строка заголовка (строка с именами столбцов).

  • Затем за этой строкой заголовка следует 25 данных строк из каждого файла, то есть строки с номерами 2–26 .

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