Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Выборка данных из txt (http://forum.oszone.net/showthread.php?t=272873)

KarpovStas 27-11-2013 02:35 2262201

Выборка данных из txt
 
Имеется txt файл, в котором в каждой строке находится запись "Количество: 658" (количество в каждой строке может быть любое от 0 до 100000).
Нужно выбрать строки и сохранить их в отдельный txt файл где Количество больше 500.
Буду очень благодарен за помощь.

Kazun 27-11-2013 09:03 2262257

PowerShell:
Код:

Get-Content file.txt | Where {[int]$_.split(":")[1].Trim() -gt 500} | Out-File result.txt

Iska 27-11-2013 09:07 2262258

PowerShell:
Код:

$sSourceFile = "E:\Песочница\0333\Source.txt"
$sDestFile  = "E:\Песочница\0333\Destination.txt"

Select-String -Path $sSourceFile -Pattern "^Количество: (?:\d{4,}|[6-9]\d{2,}|5(?:[^0]\d|\d[^0]))$" -Encoding Default |`
    ForEach-Object -Process { $_.Line } | Out-File -FilePath $sDestFile -Encoding Default


KarpovStas 27-11-2013 10:54 2262296

Iska, Создаётся почету пустой txt

Kazun, скрипт выполняется с ошибкой так как берет сразу первую запись из строки, но в ней другие данные.

Kazun 27-11-2013 11:20 2262310

Ошибку можно игнорировать, т.к. файл будет создан, для исключения:
Код:

Get-Content file.txt | Where {$_ -match "Количество:" -and [int]$_.split(":")[1].Trim() -gt 500} | Out-File result.txt

KarpovStas 27-11-2013 11:36 2262314

Kazun, еще есть проблема число после символа ":" иногда есть с пробелом например "10 000"
можно как то пробелы игнорировать?

Kazun 27-11-2013 11:56 2262321

Код:

Get-Content file.txt | Where {$_ -match "Количество:" -and [int]$_.split(":")[1].replace(" ","") -gt 500} | Out-File result.txt

KarpovStas 27-11-2013 12:28 2262328

Kazun, все равно ошибка
Не удается преобразовать значение "3*109" в тип "System.Int32". Ошибка: "Входная строка имела неверный формат."
J:\a.ps1:4 знак:64
+ Get-Content $sSourceFile | Where {[int]$_.split(":")[1].replace <<<< (" ","") -gt 500} | Out-File $sDestFile
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException

Kazun 27-11-2013 12:31 2262330

3*109 - Теперь и умножение требуется?

KarpovStas 27-11-2013 12:35 2262334

Kazun, "нет 3 109" с пробелом.
Сюда скопировал неверно.
В общем в значениях где есть пробел между цифрами, Ошибка Не удается преобразовать значение в тип "System.Int32". Ошибка: "Входная строка имела неверный формат."

Kazun 27-11-2013 12:41 2262341

Пример:
PS > gc 1.txt
Количество: 658
Привет
Количество: 1000
Количество: 500
Количество: 1
Количество: 10 0000

Вывод:
Код:

PS > Get-Content 1.txt | Where {$_ -match "Количество:" -and [int]$_.split(":")[1].replace(" ","") -gt500}
Количество: 658
Количество:  1000
Количество:  10  0000

В таком случае приведите ваш файл с проблемной строкой.

KarpovStas 27-11-2013 12:58 2262347

Kazun, Пример строк:
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 54 403 Еще какой то текст

Kazun 27-11-2013 13:07 2262352

Код:

Get-Content file.txt | Where {$_ -match "Количество: (\d+ ?\d+)" | Where {[int]$matches[1].Replace(' ','') -gt 500}} | Out-File result.txt

KarpovStas 27-11-2013 13:53 2262386

Kazun, работает, но если в "Количество: (находится значения от 1 до 9 )
То Ошибка: Не удается индексировать в массив NULL

Kazun 27-11-2013 14:02 2262390

Не тот код вставляете, здесь нет массива и подобной ошибки не должно возникать.

KarpovStas 27-11-2013 14:08 2262395

Код что вы мне дали
Код:

Get-Content J:\3.txt | Where {$_ -match "Количество: (\d+ ?\d+)" | Where {[int]$matches[1].Replace(' ','') -gt 500}} | Out-File J:\save.txt
только изменил пути к файлам

скриншот с ошибкой http://4.firepic.org/4/images/2013-1...pcfbzt5vc1.png

Kazun 27-11-2013 14:25 2262405

Тогда приведите строку на которой возникает ошибка.

KarpovStas 27-11-2013 14:29 2262409

в такой строке ошибка
Код:

Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 1 Еще какой то текст
в такой строке ошибки нет
Код:

Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 10 Еще какой то текст
если значения больше 10 то ошибки нет

Kazun 27-11-2013 14:41 2262417

Код:

Get-Content J:\3.txt | Where {$_ -match "Количество: (\d+ ?\d+)"} | Where {[int]$matches[1].Replace(' ','') -gt 500} | Out-File J:\save.txt

KarpovStas 27-11-2013 14:52 2262431

теперь без ошибок, но если значения больше 500 то в save.txt не сохраняет.
Предыдущий скрипт сохранял

Kazun 27-11-2013 15:18 2262459

Такого результата я не могу получить:
PS > gc 1.txt
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 54 403 Еще какой то текст
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 303 Еще какой то текст
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 603 Еще какой то текст
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 1 Еще какой то текст
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 1 111 Еще какой то текст
PS > gc 1.txt | Where{$_ -match "Количество: (\d+ ?\d+)"} | Where {[int]$matches[1].Replace(' ','') -gt 500}
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 54 403 Еще какой то текст
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 603 Еще какой то текст
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 1 111 Еще какой то текст

Вывод из консоли:
gc J:\3.txt | Where{$_ -match "Количество: (\d+ ?\d+)"} | Foreach {[int]$matches[1].Replace(' ','')}

KarpovStas 27-11-2013 15:29 2262477

Все работает
БОЛЬШОЕ СПАСИБО!!!

Iska 27-11-2013 17:16 2262559

Kazun, завидую Вашему долготерпению.

KarpovStas, если бы Вы сразу привели пример реального файла, тема бы не расползлась на три страницы.


Время: 11:48.

Время: 11:48.
© OSzone.net 2001-