Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - объединить данные из папок в один csv

Ответить
Настройки темы
PowerShell - объединить данные из папок в один csv

Старожил


Сообщения: 292
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


У меня много файлов 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
Благодарности: 8086

Профиль | Отправить PM | Цитировать


kontox, Вы ж не первый день на форуме — есть ряд вопросов, влияющих на код: какова кодировка файлов, есть ли BOM, если это юникод, какие концы строк, есть ли заголовки в файлах и т.д.

Упакуйте пару-тройку таких папок с файлами в один архив и выложите его на DropMeFiles.com.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:04, 29-09-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Iska, есть системные умолчания, можно и нужно исходить из них. А прибивать к коду гвоздями чужеродные концы строк уже в случае необходимости.

Цитата kontox:
1.csv (1kb)
2.csv(1kb)
3.csv(1kb)
4.csv(4kb)
5.csv(4kb)
6.csv(4kb)
7.csv(4kb) »
Ну и у какого файла тут максимальный размер?! По описанию складывается впечатление, что обобщающий файл будет по размеру как сумма остальных файлов (за вычетом заголовков).

Отправлено: 12:03, 30-09-2018 | #3


Старожил


Сообщения: 292
Благодарности: 0

Профиль | Отправить PM | Цитировать


везде все поля одинаковые.

Последний раз редактировалось kontox, 05-10-2018 в 14:47.


Отправлено: 13:04, 30-09-2018 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить 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


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить 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

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:09, 30-09-2018 | #6


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить 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
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Busla:
(если итоговой файл попытаться положить внутри директорий для поиска - будет плохо) »
А если перед началом поиска его тупо удалять?

Отправлено: 12:45, 01-10-2018 | #8


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Iska, это сквозной pipeline - результирующий файл создаётся когда ещё не все директории прочитаны
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:01, 01-10-2018 | #9


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Busla, спасибо, ясно, такой фокус не сработает.

Отправлено: 17:10, 01-10-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - объединить данные из папок в один csv

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход