|
Компьютерный форум 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 |
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать Iska, подскажите, я пытаюсь использовать ваше решение, но выходит ошибка.
скрин |
Отправлено: 14:45, 02-10-2018 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать kontox, похоже, у вас старая версия powershell
какая ОС? по идее, этот код надо класть в файл с расширением ps1 и запускать как скрипт |
Отправлено: 15:40, 02-10-2018 | #12 |
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать Busla, windows 7 x32
я с расширением ps1 и делал. Busla, проверил, Вы правы. Дело в версии PS. Код от Iska шикарно отработал. |
Отправлено: 15:48, 02-10-2018 | #13 |
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать Iska, Busla, а можно вас попросить усложнить код ps.
$sRootFolder = 'C:\Мои проекты\0203' допусти проектов 10 $sRootFolder = 'C:\Мои проекты\0204' $sRootFolder = 'C:\Мои проекты\0205' $sRootFolder = 'C:\Мои проекты\0206' ... Как сделать чтобы для всех этих папок создавались файлы csv(в каждой отдельно соответственно). Потому что Каждый проект отдельная аналитика а то для каждый папки придется создать 10 ps файлов)) |
Отправлено: 13:46, 04-10-2018 | #14 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать kontox, не надо создавать 10 файлов проектов. Можно задать получение «корневого» каталога параметром скрипта и десять раз вызвать его из пакетного файла, передав одному и тому же скрипту, соответственно, десять разных аргументов. Можно просто оформить текущее содержимое отдельной функцией, где параметром функции будет «корневой» каталог и вызывать её десять раз, передавая ей каждый раз другой аргумент.
Или тупо, по рабоче-крестьянски, просто перечислить, або массивом, в том же самом коде, например: Скрытый текст
$aRootFolders = @('C:\Мои проекты\0203', 'C:\MyProjects\0002', 'C:\Мои проекты\0206', 'C:\Мои проекты\0207', 'C:\MyProjects\0003') foreach($sRootFolder in $aRootFolders) { if([System.IO.Directory]::Exists($sRootFolder)) { Write-Host "[$sRootFolder]" -ForegroundColor Green Get-ChildItem -Path $sRootFolder -Directory -Depth 1 |` ForEach-Object -Process { Write-Host " [$($_.Name)]" -ForegroundColor Green Get-ChildItem -Path $_.FullName -File -Recurse -Include "*.csv" |` ForEach-Object -Begin { $oFileInfo = $null } -Process { if($_.Length -ge $oFileInfo.Length) { $oFileInfo = $_ } } -End { Write-Host " $($oFileInfo.Name)" -ForegroundColor Cyan $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 { $sResultFileName = "$sRootFolder\$(([System.IO.DirectoryInfo]::new($sRootFolder).BaseName)).csv" Write-Host "$sResultFileName`r`n" -ForegroundColor Yellow [System.IO.File]::WriteAllText($sResultFileName, [System.String]::Join("`n", $aContent)) } } else { Write-Host "Can't find root folder [$sRootFolder]." -ForegroundColor Red } } |
Отправлено: 22:24, 04-10-2018 | #15 |
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать Iska, из-за своей невнимательность я оплошал и ещё как. Дело в том, что я думал, что все файлы, у который идет одинаковый размер , они содержат одинаковые данные
1.csv (1kb) 2.csv(1kb) 3.csv(1kb) 4.csv(4kb) 5.csv(4kb) 6.csv(4kb) 7.csv(4kb) » На деле, после ручного анализа они имеют одинаковый размер, но данные разные там, не колонки, а именно их значения Можно ли скрипт переделать, чтобы он просто все csv объединял в один. без учета размера. |
Отправлено: 15:31, 07-10-2018 | #16 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать То есть, все *.csv из всех подкаталогов первого уровня очередного «корневого» каталога объединяются в один, я правильно понимаю?
Попробуйте так: Скрытый текст
$aRootFolders = @('C:\Мои проекты\0203', 'C:\MyProjects\0002', 'C:\Мои проекты\0206', 'C:\Мои проекты\0207', 'C:\MyProjects\0003') foreach($sRootFolder in $aRootFolders) { if([System.IO.Directory]::Exists($sRootFolder)) { Write-Host "[$sRootFolder]" -ForegroundColor Yellow $aContent = @() Get-ChildItem -Path $sRootFolder -Directory -Depth 1 |` ForEach-Object -Process { Write-Host " [$($_.Name)]" -ForegroundColor Green Get-ChildItem -Path "$($_.FullName)\*.*" -File -Include "*.csv" |` ForEach-Object -Process { Write-Host " --> $($_.Name)" -ForegroundColor Cyan $aCurrContent = [System.IO.File]::ReadAllLines($_.FullName) if($aContent.Count -eq 0) { $aContent += $aCurrContent } else { $aContent += $aCurrContent[1..$($aCurrContent.Count - 1)] } } } $sResultFileName = "$sRootFolder\$(([System.IO.DirectoryInfo]::new($sRootFolder).BaseName)).csv" Write-Host "<-- $sResultFileName`r`n" -ForegroundColor Magenta [System.IO.File]::WriteAllText($sResultFileName, [System.String]::Join("`n", $aContent))#> } else { Write-Host "Can't find root folder [$sRootFolder]." -ForegroundColor Red } } |
Отправлено: 16:29, 07-10-2018 | #17 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата kontox:
|
|
------- Отправлено: 19:46, 07-10-2018 | #18 |
Старожил Сообщения: 292
|
Профиль | Отправить PM | Цитировать Друзья, подскажите, вот код
вот код $aRootFolders = @('C:\Intel\Game_4', 'C:\Intel\Game_5') foreach($sRootFolder in $aRootFolders) { if([System.IO.Directory]::Exists($sRootFolder)) { Write-Host "[$sRootFolder]" -ForegroundColor Yellow $aContent = @() Get-ChildItem -Path $sRootFolder -Directory -Depth 1 |` ForEach-Object -Process { Write-Host " [$($_.Name)]" -ForegroundColor Green Get-ChildItem -Path "$($_.FullName)\*.*" -File -Include "*.csv" |` ForEach-Object -Process { Write-Host " --> $($_.Name)" -ForegroundColor Cyan $aCurrContent = [System.IO.File]::ReadAllLines($_.FullName) if($aContent.Count -eq 0) { $aContent += $aCurrContent } else { $aContent += $aCurrContent[1..$($aCurrContent.Count - 1)] } } } $sResultFileName = "$sRootFolder\$(([System.IO.DirectoryInfo]::new($sRootFolder).BaseName)).csv" Write-Host "<-- $sResultFileName`r`n" -ForegroundColor Magenta [System.IO.File]::WriteAllText($sResultFileName, [System.String]::Join("`n", $aContent))#> } else { Write-Host "Can't find root folder [$sRootFolder]." -ForegroundColor Red } } как сделать, чтобы напротив строки, было указано из какой подпапки строка? пример на снике |
Отправлено: 15:24, 25-10-2018 | #19 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|