Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 3

Сортировать текстовые файлы

10.02.2021, 13:17. Показов 3782. Ответов 29

Студворк — интернет-сервис помощи студентам
Здраствуйте)
Дано папка с текстовыми файлами,
нужно по 5 строке осуществить поиск значения и если совпало переместить текстовый файл в соответсвующую папку. Знания и опыт грузчика((( и немного со школы борланд паскаля


пока нашел две логики

1. Проверяю по строкам паттерн 300, и записываю имя файл в текстовый документ ,т.к. ищет по всему файлу попадают и с совпадением дальше нужной нам строки ( тоесть не нужный нам файл отсортируется ) а так же дублирует запись при наличии повторного значения, Удаляем повторы, записывает с доп знаками удаляем их, переносим список отсортированных файлов в нужную папку. я так понимаю тупиковая реализация т.к. по паттерну никак не произвести поиск только по нужной строке или до нужной строки.

PowerShell
1
2
3
4
5
6
7
$match = "500 "  
Select-String -Path C:\00000\*.txt -Pattern $match | Select-Object -Property filename | Set-Content fn.txt 
gc fn.txt | sort | get-unique > unique.txt
Get-Content Unique.txt | foreach-object {$_ -replace "^.*?(GG.*)",'$1'} | Set-Content out.txt
Get-Content out.txt | ForEach-Object {$_ -replace 't\}', 't' } | Set-Content out2.txt
$it=Get-Content out2.txt
Move-Item $it -Destination "C:\x5\"
2. присваиваю переменной путь, присваиваю переменной содержимое файла по пути (что бы можно было взять на сравнение только нужную строку) "захватить имя файла" не получилось.. после команды селектстринг тоже захвата имени файла не происходит((( , все знаний не хватило как теперь этот файл переместить, вроде поиск по нужной строке есть, но при совпадении повершелл просто выдает мне в консоли строку и все.
PowerShell
1
2
3
$fn= "C:\000\*.txt" 
$of= Get-Content $fn | Select-Object -Property filename
select-String -inputObject $of[4] -pattern "300" | Set-Content fn.txt
как Захватить имя файла что бы можно было записать его для дальнейшего перемещения. А если возможно просто сразу при совпадении переместить файл вообще было б хорошо)
почему повершелл? нет проблем с типами данных,открытием закрытием файлов...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2021, 13:17
Ответы с готовыми решениями:

Текстовые файлы и замена в нем заданных значений
Добрый день Есть вопрос как можно заменить в файле определенные значения на заданные В директории есть файлы с расширением HL1 в этих...

Создать пакетный файл, который будет сортировать файлы по размеру
Парни помогите, нужно создать пакетный файл который будет сортировать из поточного каталога файлы по следующему алгоритму. - файлы...

Вставить имена файлов в текстовые файлы
Задача - обработать все текстовые файлы в папке. Для каждого файла вставить в него первой строкой его имя с расширением и текстом указанным...

29
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
10.02.2021, 14:03
лучше бы вы на постановку задачи столька букав потратили

Добавлено через 5 минут
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Дано папка с текстовыми файлами,
param (
    [System.IO.DirectoryInfo]$targetDirectory = "d:\tmp",
    [System.IO.DirectoryInfo]$destinationDirectory = "d:\tmp\01",
    [string]$wildcard = "*.txt",
    [regex]$pattern = ".*"
)
# нужно по 5 строке осуществить поиск значения
 
Get-ChildItem $targetDirectory -Filter $wildcard | ForEach-Object {
    if ($pattern.Match(Get-Content $_ | Select-Object -Skip 4 -First 1)){
        Copy-Item $_ -Destination $destinationDirectory
        # и если совпало переместить текстовый файл в соответсвующую папку
    }
}
Добавлено через 11 минут
[regex]$pattern = "300"

Добавлено через 2 минуты
ну и после тестирования )))

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Дано папка с текстовыми файлами,
param (
    [System.IO.DirectoryInfo]$targetDirectory = "d:\tmp",
    [System.IO.DirectoryInfo]$destinationDirectory = "d:\tmp\01",
    [string]$wildcard = "*.txt",
    [regex]$pattern = "200"
)
# нужно по 5 строке осуществить поиск значения
 
Get-ChildItem $targetDirectory -Filter $wildcard | ForEach-Object {
    if ($pattern.Match((Get-Content $_ | Select-Object -Skip 4 -First 1))){
        Copy-Item $_ -Destination $destinationDirectory
        # и если совпало переместить текстовый файл в соответсвующую папку
    }
}
1
 Аватар для volodin661
6685 / 2277 / 347
Регистрация: 10.12.2013
Сообщений: 7,861
10.02.2021, 14:48
Цитата Сообщение от junenot Посмотреть сообщение
Знания и опыт грузчика
Пригодятся.

Основной принцип хорошего скриптового языка это DWIM ( Do What I Mean ).
Или иначе: я, пользователь, тебе говорю, а ты, компьютер вшивый, делаешь это изо всех сил.

Наиболее удачен perl в этом направлении, но powershell тоже старается.

У Паскаля как у строгого компилируемого языка обратный принцип; пользователь лебезит перед ним на задних лапках,
а в ответ видит высокомерные сообщения об ошибках и, сквозь зубы: жёлтые штаны - 2 раза ку.


Цитата Сообщение от junenot Посмотреть сообщение
нужно по 5 строке осуществить поиск значения и если совпало переместить текстовый файл в соответсвующую папку.

PowerShell
1
select-string '300' *.txt |? LineNumber -eq 5 |% Path | Move-Item -Destination Folder
2
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
10.02.2021, 14:53
volodin661, так все строки перебирать будет
0
 Аватар для volodin661
6685 / 2277 / 347
Регистрация: 10.12.2013
Сообщений: 7,861
10.02.2021, 14:59
---
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
10.02.2021, 15:09
Лучший ответ Сообщение было отмечено junenot как решение

Решение

PowerShell
1
2
3
4
5
6
7
param (
    $pathIN  = "C:\000",
    $pathOut = "C:\x5",
    $pattern = "300"
)cls
 
Gci $pathIN *.txt|?{(gc $_.FullName)[4]-match$pattern}|move -d $pathOut
2
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
10.02.2021, 15:31
Fors1k, так тоже

Добавлено через 51 секунду
самоцель краткая запись?

PowerShell
1
((gci d:\tmp\*.txt).Where{(gc $_|select -skip 4 -f 1) -like "*200*"}).foreach{[io.file]::Copy($_, "d:\tmp\01\$($_.name)")}
Добавлено через 9 минут
Цитата Сообщение от volodin661 Посмотреть сообщение
---
беру свои слова обратно
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
10.02.2021, 15:33
Цитата Сообщение от alhaos Посмотреть сообщение
Fors1k, так тоже
Что "так тоже"?
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
10.02.2021, 15:43
Цитата Сообщение от Fors1k Посмотреть сообщение
Что "так тоже"?
уже получается не тоже

файл будет читать до конца

Добавлено через 4 минуты
PowerShell
1
2
3
4
5
6
7
8
9
10
11
PowerShell 7.1.1
Copyright (c) Microsoft Corporation.
 
https://aka.ms/powershell
Type 'help' to get help.
 
PS C:\Users\alHaos> (Measure-Command {((gc D:\tmp\test.txt)[4])}).TotalMilliseconds
2714,5815
PS C:\Users\alHaos> (Measure-Command {gc D:\tmp\test.txt | select -Skip 4 -First 1}).TotalMilliseconds
8,123
PS C:\Users\alHaos>
Добавлено через 4 минуты
PowerShell
1
2
3
4
PS C:\Users\alHaos> (Measure-Command {Select-String D:\tmp\test.txt -pattern "300" | ? LineNumber -eq 5}).TotalMilliseconds
137,0548
PS C:\Users\alHaos> (Measure-Command {gc D:\tmp\test.txt | select -Skip 4 -First 1}).TotalMilliseconds
3,2986
0
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 3
10.02.2021, 15:47  [ТС]
Спасибо большое, извиняюсь что так долго (к компьютеру только смог добраться)
к сожалению копирует все файлы из директории игнорируя фильтр. решение ниже найдено, спасибо за помощь.
0
 Аватар для volodin661
6685 / 2277 / 347
Регистрация: 10.12.2013
Сообщений: 7,861
10.02.2021, 15:48
основная моя претензия к реализации трубы в powershell это то, что я никак стратегически не управляю прохождением об'ектов по трубе.
0
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 3
10.02.2021, 16:01  [ТС]
этот вариант работает!) спасибо Вам/ Fors1k
даже понятно что происходит )))
извините даж с цитированием сообщений не в ладах )))

Добавлено через 8 минут
Цитата Сообщение от alhaos Посмотреть сообщение
Добавлено через 2 минуты
ну и после тестирования )))
Спасибо большое, извиняюсь что так долго (к компьютеру только смог добраться)
к сожалению копирует все файлы из директории игнорируя фильтр. решение ниже найдено, спасибо за помощь.

Цитата Сообщение от volodin661 Посмотреть сообщение
Пригодятся.
Основной принцип хорошего скриптового языка это DWIM ( Do What I Mean ).
Или иначе: я, пользователь, тебе говорю, а ты, компьютер вшивый, делаешь это изо всех сил.
Спасибо большое)
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
10.02.2021, 16:18
alhaos, ну, если говорить об очень больших файлах, то, конечно, да
PowerShell
1
2
3
4
5
6
7
param (
    $pathIN  = "C:\000",
    $pathOut = "C:\x5",
    $pattern = "300"
)cls
 
Gci $pathIN *.txt|?{(gc $_.FullName|select -Index 4) -match $pattern}|move -d $pathOut
Цитата Сообщение от volodin661 Посмотреть сообщение
основная моя претензия к реализации трубы в powershell это то, что я никак стратегически не управляю прохождением об'ектов по трубе.
"Если можно, поподробнее." (с) Тина Канделаки
0
 Аватар для volodin661
6685 / 2277 / 347
Регистрация: 10.12.2013
Сообщений: 7,861
10.02.2021, 16:43
Цитата Сообщение от Fors1k Посмотреть сообщение
"Если можно, поподробнее."
Например, хочется иметь возможность управлять (chunk)-ом об'ектов, как это сделано с помощью параметра -ReadCount
у командлета Get-Content.

удобный Оператор мог бы выглядеть как-нибудь вот так:

PowerShell
1
"A".."Z" |3| { $_[0] }
output:
A
B
C
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
10.02.2021, 21:00
Цитата Сообщение от volodin661 Посмотреть сообщение
удобный Оператор мог бы выглядеть
Ну, можно ведь так:
PowerShell
1
"А".."Я"|select -first 3
Конвейер - штука простая, он массивы передает по одному элементу за раз... ну и как водится, правил без исключений не бывает - хэштаблицы он кучей передает...
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
10.02.2021, 21:16
Цитата Сообщение от YuS_2 Посмотреть сообщение
Конвейер - штука простая, он массивы передает по одному элементу
ну это как их передавать

PowerShell
1
, ("А".."Я") | Select-Object -first 3
Добавлено через 1 минуту
YuS_2, а вот уважаемого volodin661, думаю как и меня больше интересуют порции которыми можно было бы передавать данные.
0
 Аватар для volodin661
6685 / 2277 / 347
Регистрация: 10.12.2013
Сообщений: 7,861
10.02.2021, 21:45
Цитата Сообщение от alhaos Посмотреть сообщение
уважаемого volodin661 интересуют порции
именно так.

PowerShell
1
2
3
4
"A".."Z" |3,4| { $_ }
 
# в скриптблок прилетят следующие порции:
# (("A","B","C"),("D","E","F","G")) , (("H","I","J"),("K","L","M","N")) ... ( (три об`екта),(четыре об`екта) ) ...
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
11.02.2021, 03:34
volodin661, ты подал отличную идею.
Цитата Сообщение от volodin661 Посмотреть сообщение
PowerShell
1
2
3
"A".."Z" |3,4| { $_ }
# в скриптблок прилетят следующие порции:
# (("A","B","C"),("D","E","F","G")) , (("H","I","J"),("K","L","M","N")) ... ( (три об`екта),(четыре об`екта) ) ...
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function Get-PipeChunks{[alias("%%")]
    PARAM(
        [parameter(ValueFromPipeline, Mandatory)]
        $obj,
        [parameter(Position = 0,Mandatory=$true)]
        [int[]]$n
    )
 
    $obj|ForEach{
        $global:i = 0
        $t = $obj.gettype()
        rv re -s global -ea 0
        function global:Chunks{
            rv re -s global -ea 0
            rv rere -s global -ea 0
        }
    }{
        if(!(gv re -ea 0)){
            $global:re = [Collections.ArrayList]::new()
        }
 
        [void]$re.add($_)
        if($n.Count -gt 1){
            if($re.Count%$n[$i] -eq 0){
                $global:i++
                [object[]]$global:rere += ,($re-as$t)
                rv re -s global -ea 0 
                if(($i) -eq $n.Count){
                    $global:i = 0
                    ,$rere
                }
            }
        }
        elseif($re.Count%$n[0] -eq 0){,($re-as$t)}
    }{
        if($n.Count -gt 1){
            if($rere){
                if($re){[object[]]$global:rere += ,($re-as$t)}
                ,$rere
            }
            elseif($re){[object[]]$global:rere += ,($re-as$t);,$rere}
        }
        else{
            if($re){,($re-as$t)}
        }
    }
}
PowerShell
1
2
3
4
5
6
7
8
9
[int[]]$nums=1..18
 
,$nums|%% 3,4|ForEach{Chunks
    $_|ForEach{
        $_
        "*"*3
    }
    "="*6
}
Как хотел?)
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
11.02.2021, 05:49
Fors1k, не знаю как хотел volodin661, а я бы хотел чтобы была возможность это делать без написания дополнительных функций, с необходимостью добавлять их в свои скрипты в виде кода, модуля или библиотеки, без необходимости увеличивать размер кода или тиражировать модули на остальные устройства.

Добавлено через 25 минут
PowerShell
1
2
3
4
5
6
7
8
9
10
("a".."z").Where( { $_ }, "split", 3).ForEach{ begin { $i = 0 } process { [PSCustomObject]@{id = $i; value = $_ }; $i++ } } | ForEach-Object {
    if ($_.id -eq 0){
        $_.value -join ", "
    }
    else {
        ($_.value).ForEach{ begin { $i = 0 } process { [PSCustomObject]@{id = $i; value = $_ }; $i++ } } |
            Group-Object { [math]::Truncate($_.id / 4) } |
                ForEach-Object { $_.group.value -join ", " }
    }
}
Добавлено через 17 секунд
Code
1
2
3
4
5
6
7
a, b, c
d, e, f, g
h, i, j, k
l, m, n, o
p, q, r, s
t, u, v, w
x, y, z
Добавлено через 21 минуту
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function foo() {
    param(
        [parameter(ValueFromPipeline, Mandatory)] [Array]$arr,
        [parameter(Position = 0, Mandatory)] [int]$startFraction,
        [parameter(Position = 1, Mandatory)] [int]$fraction
    )
    $arr.Where( { $_ }, "split", $startFraction).ForEach{ begin { $i = 0 } process { [PSCustomObject]@{id = $i; value = $_ }; $i++ } } | ForEach-Object {
        if ($_.id -eq 0) {
            ,$_.value 
        }
        else {
            ($_.value).ForEach{ begin { $i = 0 } process { [PSCustomObject]@{id = $i; value = $_ }; $i++ } } |
            Group-Object { [math]::Truncate($_.id / $fraction) } |
            ForEach-Object { , $_.group.value }
        }
    }
}
 
, ("a".."z") | foo 3 4 | ForEach-Object {
    $_ -join ", "
}
а не лепить "горбатого"
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
11.02.2021, 14:58
Цитата Сообщение от alhaos Посмотреть сообщение
ну это как их передавать
как не передавай, а в конвейер уходит по одному элементу за один раз... за исключением (читай выше по тексту)
Цитата Сообщение от alhaos Посмотреть сообщение
, ("А".."Я") | Select-Object -first 3
И? Что демонстрирует этот пример?
Один элемент (объект) может состоять из массива объектов, что в твоем примере, собственно, и продемонстрировано...

Цитата Сообщение от alhaos Посмотреть сообщение
думаю как и меня больше интересуют порции которыми можно было бы передавать данные.
Это-то я понял, но увы и ах... пока, во всяком случае.

Цитата Сообщение от alhaos Посмотреть сообщение
я бы хотел чтобы была возможность это делать без написания дополнительных функций, с необходимостью добавлять их в свои скрипты в виде кода, модуля или библиотеки, без необходимости увеличивать размер кода или тиражировать модули на остальные устройства.
Powershell, как раз, тем и хорош, что можно без напряга писать свой код, модули, функции, классы... да что душе угодно (немного поутрируем), если чего-то не хватает и использовать это в конечном коде.

Цитата Сообщение от alhaos Посмотреть сообщение
а не лепить "горбатого"
Ты мечтаешь жить в идеальном мире - попробуй, создать такой ... ну, или в крайнем случае, вынести мозг микрософту, чтобы они реализовали любые хотелки. Реально это? Сильно сомневаюсь...
Тем не менее, кое-что, все таки они делают и исправляют, и даже иногда происходит реализация новшеств... так что исключать окончательно, ничего не будем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2021, 14:58
Помогаю со студенческими работами здесь

Запретить пользователям удалять текстовые файлы
Добрый день. Пользователям разрешено создавать и редактировать текстовые файлы, но удалять нельзя. Windows Server 2008 Enterprise....

Как искать все текстовые файлы?
Возможно ли с помощью функции GetAbsolutePathName получить все файлы формата txt независимо от их имен . Когда в параметре просто имя ,...

Склеить текстовые файлы, заданные в качестве аргументов
Разработать командный файл, который бы склеивал текстовые файлы, заданные в качестве аргументов, и сортировал бы строки результирующего...

Объединить текстовые файлы и заменить в них слова
Здравствуйте, помогите, пожалуйста. Есть много однотипных txt файлов, которые надо объединить в один, но при этом везде сочетание букв...

Как открыть текстовые файлы в папке, используя bat
Имеется путь к папке, точно известно, что в ней есть непустые текстовые файлы. @echo off :st echo: Write file's expancion...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru