|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - объединить данные из папок в один csv |
|
|
PowerShell - объединить данные из папок в один csv
|
Старожил Сообщения: 292 |
У меня много файлов csv, которые находятся в разных папках. пример
"C:\Users\Admin\Downloads\28-09-2018_17-39-27\data\23842735206960137\files in csv" next "C:\Users\Admin\Downloads\28-09-2018_17-39-27\data\23842735207380137\files in csv" В каждой папке примерно 30-35 файлов мне нужно объединить их в один csv Также, в каждой папке, например 23842735206960137 23842735207380137 не обязательно работать со всеми 34 файлами. Чтобы объединиться в один набор данных из каждой папки, мне нужно взять только один файл, который занимает больше места. Чтобы быть более понятным в папке 23842735206960137 такие файлы 1.csv (1kb) 2.csv(1kb) 3.csv(1kb) 4.csv(4kb) 5.csv(4kb) 6.csv(4kb) 7.csv(4kb) ВСЕГДА другие файлы имеют тот же размер и тот же контент, который имеет csv с максимальным размером. Т.Е. Итак, как только мы достигнем первого файла с максимальным размером, все остальные файлы имеют одинаковый размер и содержат одну и ту же информацию, что и самый первый с макс размером. Поэтому мы берем только первый файл с максимальным размером из каждой папки, а затем объединяем эти файлы в один набор данных. Как это сделать в Powershell? |
|
Отправлено: 17:39, 29-09-2018 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать kontox, Вы ж не первый день на форуме — есть ряд вопросов, влияющих на код: какова кодировка файлов, есть ли BOM, если это юникод, какие концы строк, есть ли заголовки в файлах и т.д.
Упакуйте пару-тройку таких папок с файлами в один архив и выложите его на DropMeFiles.com. |
Отправлено: 19:04, 29-09-2018 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Iska, есть системные умолчания, можно и нужно исходить из них. А прибивать к коду гвоздями чужеродные концы строк уже в случае необходимости.
Цитата kontox:
|
|
Отправлено: 12:03, 30-09-2018 | #3 |
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать везде все поля одинаковые.
|
Последний раз редактировалось kontox, 05-10-2018 в 14:47. Отправлено: 13:04, 30-09-2018 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать kontox, попробуйте так:
Скрытый текст
$sRootFolder = 'C:\Мои проекты\0203'
if([System.IO.Directory]::Exists($sRootFolder)) {
Get-ChildItem -Path $sRootFolder -Directory |`
ForEach-Object -Process {
Get-ChildItem -Path $_.FullName -File -Recurse -Include "*.csv" |`
ForEach-Object -Begin {
$oFileInfo = $null
} -Process {
if($_.Length -ge $oFileInfo.Length) {
$oFileInfo = $_
}
} -End {
$oFileInfo
}
} | ForEach-Object -Begin {
$aContent = @()
} -Process {
$aCurrContent = [System.IO.File]::ReadAllLines($_.FullName)
if($aContent.Count -eq 0) {
$aContent += $aCurrContent
} else {
$aContent += $aCurrContent[1..$($aCurrContent.Count - 1)]
}
} -End {
[System.IO.File]::WriteAllText("$sRootFolder\$(([System.IO.DirectoryInfo]::new($sRootFolder).BaseName)).csv", [System.String]::Join("`n", $aContent))
}
} else {
Write-Host "Can't find root folder [$sRootFolder]." -ForegroundColor Red
}
|
|
Отправлено: 14:54, 30-09-2018 | #5 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата kontox:
# Корневой каталог $fld = 'test' # Фильтр файлов $flt = '*.csv' # Выходной файл .csv $out = 'test.csv' if (test-path $out){del $out} dir $fld\* -dir|%{ dir $_.fullname -filt $flt -file|sort -prop length -des|` select -first 1|%{import-csv $_.fullname -del ';'} }|sort -prop date|export-csv $out -not -app |
|
------- Отправлено: 15:09, 30-09-2018 | #6 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Однострочник:
Get-ChildItem ./ -Recurse -File -Filter "*.csv" | Group-Object -Property PSParentPath | % { $max = @{ value = 0; object = $null }; $_.Group | % { if ($max.value -le $_.length) { $max.value=$_.value; $max.object=$_ }}; $max.object } | % {Import-Csv $_.FullName -Delimiter ';' } | Export-Csv -NoTypeInformation -Delimiter ';' ..\all.csv Куда складывать - путь к файлу в самом конце (если итоговой файл попытаться положить внутри директорий для поиска - будет плохо) |
Отправлено: 12:15, 01-10-2018 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Busla:
|
|
Отправлено: 12:45, 01-10-2018 | #8 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Iska, это сквозной pipeline - результирующий файл создаётся когда ещё не все директории прочитаны
|
Отправлено: 14:01, 01-10-2018 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Busla, спасибо, ясно, такой фокус не сработает.
|
Отправлено: 17:10, 01-10-2018 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - [решено] Создание папок и подпапок из csv | APermyakov@twitter | Скриптовые языки администрирования Windows | 9 | 26-02-2017 17:16 | |
Любой язык - Перенести данные из csv в html | OverSense | Скриптовые языки администрирования Windows | 2 | 14-02-2014 22:11 | |
Разное - объединить несколько объектов в один | Pavelasd | Microsoft Office (Word, Excel, Outlook и т.д.) | 4 | 09-12-2012 16:41 | |
MSFT SQL Server - Объединить несколько запросов в один | HFShak | Программирование и базы данных | 0 | 30-11-2012 10:19 | |
Быстро объединить несколько DVD в один | uhuh | Видео и аудио: обработка и кодирование | 1 | 25-09-2009 09:22 |
|