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

Компьютерный форум 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

 

Старожил


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

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


Изображения
Тип файла: jpg 02-10-2018 14-43-12.jpg
(265.7 Kb, 5 просмотров)

Iska, подскажите, я пытаюсь использовать ваше решение, но выходит ошибка.
скрин

Отправлено: 14:45, 02-10-2018 | #11



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

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


Ветеран


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

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


kontox, похоже, у вас старая версия powershell
какая ОС?

по идее, этот код надо класть в файл с расширением ps1 и запускать как скрипт
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:40, 02-10-2018 | #12


Старожил


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

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


Busla, windows 7 x32

я с расширением ps1 и делал.

Busla, проверил, Вы правы. Дело в версии PS. Код от Iska шикарно отработал.

Отправлено: 15:48, 02-10-2018 | #13


Старожил


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

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

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

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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата kontox:
Можно ли скрипт переделать, чтобы он просто все csv объединял в один. без учета размера. »
Код: Выделить весь код
# Корневой каталог
$fld = 'test'
# Фильтр файлов
$flt = '*.csv'
# Выходной файл .csv
$out = 'test.csv'

dir $fld\* -dir|%{dir $_.fullname -filt $flt -file}|%{import-csv $_.fullname -del ';'}|sort -prop date|export-csv $out -not

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

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

Отправлено: 19:46, 07-10-2018 | #18


Старожил


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

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


Изображения
Тип файла: jpg Снимок.JPG
(26.1 Kb, 3 просмотров)

Друзья, подскажите, вот код
вот код


$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



Компьютерный форум 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




 
Переход