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

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

Ответить
Настройки темы
Любой язык - Нахождение совпадения в строке и сохранение строк в разные файлы

Новый участник


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

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


Добрый день!

Помогите хотя бы с направлением, куда копать.

Есть огромный (несколько млн строк) текстовый файл с логами. Нужно прочитать строку, найти в ней совпадение имени сервиса и в зависимости от этого сохранить строку в другой файл.

Код: Выделить весь код
20230810 16:44 service1 online
20230810 16:45 service2 online
20230810 17:48 service1 offline
20230810 17:49 service2 offline
В итоге получить файлы service1.log и service2.log

Заранее спасибо!

Отправлено: 19:03, 10-08-2023

 

Аватара для YuS_2

Crazy


Contributor


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

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


Цитата DJ Mogarych:
[System.IO.File]::ReadAllLines("$in") »
аналог:
Код: Выделить весь код
gc $in -raw
а вообще, для ускорения, можно и потоковое чтение/запись задействовать, что-то типа%
Код: Выделить весь код
$reader = [io.streamreader]::new('1.txt')
$writer = [io.streamwriter]::new('2.txt')
 
while ($reader.peek() -ne -1){
    $writer.write($reader.readline()) # тут можно различные проверки замутить
}
 
$reader.close()
$writer.close()

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

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

Отправлено: 18:42, 15-08-2023 | #11



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

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


Ветеран


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

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


Цитата YuS_2:
аналог: »
Не совсем, Get-Content -raw возвращает строку, a [System.IO.File]::ReadAllLines() массив строк.

A streamreader, это действительно хорошая идея.

Отправлено: 18:58, 15-08-2023 | #12


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Foreigner:
Не совсем, Get-Content -raw возвращает строку »
это да, но всегда можно отсплитить построчно, это гораздо быстрее чем построчное чтение...

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


Отправлено: 21:19, 15-08-2023 | #13


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Вот человек целое исследование провёл:
Цитата:

[System.IO.File]::ReadLines(): 6 seconds
Get-Content -ReadCount 1000: 7 seconds
Switch -File: 10 seconds
[System.IO.File]::OpenText().readtoend(): 10 seconds
[System.IO.File]::ReadAllText(): 13 seconds
[System.IO.File]::ReadAllLines(): 16 seconds
Get-Content -Raw: 46 seconds
Get-Content: 229 seconds
Reading large text files with Powershell

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 21:40, 15-08-2023 | #14


Ветеран


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

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


Попробовал с потоком, 1млн строк разбился на два файла за 6 сек:

Код: Выделить весь код
$reader  = [io.streamreader]::new("$pwd/file.log")
$writer1 = [io.streamwriter]::new("$pwd/service1.log")
$writer2 = [io.streamwriter]::new("$pwd/service2.log")

while ($reader.peek() -ne -1)
{
    switch -regex ($out = $reader.readline())
    {
         'service1' { $writer1.write($out + "`n") }
         'service2' { $writer2.write($out + "`n") }
    }
}

$reader.close()
$writer1.close()
$writer2.close()
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:07, 15-08-2023 | #15


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Foreigner, а если использовать батник megaloman-а?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 10:54, 16-08-2023 | #16


Ветеран


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

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


Цитата DJ Mogarych:
а если использовать батник megaloman-а? »
Я не могу, линукс

Отправлено: 12:24, 16-08-2023 | #17


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата DJ Mogarych:
целое исследование провёл »
Исследование не совсем полноценное... в том смысле, что не указана версия PS. В последних версиях, командлеты оптимизируют, так что цифры могут оказаться другими, при одних и тех же исходных...
Цитата DJ Mogarych:
а если использовать батник megaloman-а? »
Ночером, если делать будет нечего, попробую потестить на скорострельность разных вариантов...

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


Отправлено: 14:51, 16-08-2023 | #18


Аватара для YuS_2

Crazy


Contributor


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

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


Итоги тестов, вот такого кода:
тестовый код
Код: Выделить весь код
$file = 'out1500000.txt'

'------'
'1 - gc $file'
(measure-command{
1..3|%{$arr = $null}{$arr = gc $file}
write-host $($arr.count) -for red
}).totalseconds
'------'
'2 - gc $file -ReadCount 10000'
(measure-command{
1..3|%{$arr = $null}{$arr = gc $file -ReadCount 10000}
write-host $($arr.count) -for red
}).totalseconds
'------'
'3 - (gc $file -raw) -split "`n"'
(measure-command{
1..3|%{$arr = $null}{$arr = (gc $file -raw) -split "`n"}
write-host $($arr.count) -for red
}).totalseconds
'------'
'4 - switch -file $file {default {$psitem}}'
(measure-command{
1..3|%{$arr = $null}{$arr = switch -file $file {default {$psitem}}}
write-host $($arr.count) -for red
}).totalseconds
'------'
'5 - [io.file]::readalltext($file) -split "`n"'
(measure-command{
1..3|%{$arr = $null}{$arr = [io.file]::readalltext($file) -split "`n"}
write-host $($arr.count) -for red
}).totalseconds
'------'
'6 - [io.file]::readalllines($file)'
(measure-command{
1..3|%{$arr = $null}{$arr = [io.file]::readalllines($file)}
write-host $($arr.count) -for red
}).totalseconds
'------'
'7 - [io.file]::readlines($file) -split "`n"'
(measure-command{
1..3|%{$arr = $null}{$arr = [io.file]::readlines($file) -split "`n"}
write-host $($arr.count) -for red
}).totalseconds
'------'
'8 - [io.file]::opentext($file).readtoend() -split "`n"'
(measure-command{
1..3|%{$arr = $null}{$arr = [io.file]::opentext($file).readtoend() -split "`n"}
write-host $($arr.count) -for red
}).totalseconds
'------'
'9 - $reader.readtoend() -split "`n"'
(measure-command{
1..3|%{$arr = $null}{
    $reader = [io.streamreader]::new($file)
    $arr = $reader.readtoend() -split "`n"
    $reader.close()
}
write-host $($arr.count) -for red
}).totalseconds

- чтобы получить более-менее корректные сравнения, цель работы каждого блока была такой:
Считать из файла 1500000 строк и получить массив такого же количества строк.
PS 7.3.6
Цитата:
------
1 - gc $file
1500000
135,3993815
------
2 - gc $file -ReadCount 10000
150
4,5613858
------
3 - (gc $file -raw) -split "`n"
1500001
3,8927897
------
4 - switch -file $file {default {$psitem}}
1500000
1,8711774
------
5 - [io.file]::readalltext($file) -split "`n"
1500001
1,4145144
------
6 - [io.file]::readalllines($file)
1500000
0,8467002
------
7 - [io.file]::readlines($file) -split "`n"
1500000
2,5423216
------
8 - [io.file]:pentext($file).readtoend() -split "`n"
1500001
1,4478526
------
9 - $reader.readtoend() -split "`n"
1500001
1,7025707
PS 5.1
Цитата:
------
1 - gc $file
1500000
71,0913368
------
2 - gc $file -ReadCount 10000
150
2,0562238
------
3 - (gc $file -raw) -split "`n"
1500001
5,4825919
------
4 - switch -file $file {default {$psitem}}
1500000
1,6654813
------
5 - [io.file]::readalltext($file) -split "`n"
1500001
3,9344098
------
6 - [io.file]::readalllines($file)
1500000
0,5840069
------
7 - [io.file]::readlines($file) -split "`n"
1500000
2,4861966
------
8 - [io.file]:pentext($file).readtoend() -split "`n"
1500001
3,6093053
------
9 - $reader.readtoend() -split "`n"
1500001
3,2849391
- понятно, что безоговорочным победителем скорочтения массива строк, становится [io.file]::readalllines($file), ибо никаких дополнительных разбивок не требует...

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

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

Отправлено: 19:23, 16-08-2023 | #19


Ветеран


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

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


Интересное сравнение с 5.1

Отправлено: 19:40, 16-08-2023 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2010 - [решено] Excel 2010. Суммирование по столбцу: разные суммы, лист на млн. строк и т.д. flev45 Microsoft Office (Word, Excel, Outlook и т.д.) 2 29-05-2019 13:12
VBS/WSH/JS - массив из строк, поиск по строке matson Скриптовые языки администрирования Windows 11 09-06-2017 21:35
CMD/BAT - [решено] Нахождение совпадения без учета регистра Mikle_home88 Скриптовые языки администрирования Windows 1 04-08-2015 15:20
Расшаренные файлы в лок.сети и разные козлы SimSaf Хочу все знать 8 08-02-2013 00:02
Как переписать текстовые файлы в разные папки! Guest Программирование и базы данных 7 22-10-2004 02:57




 
Переход