Показать полную графическую версию : Выборка данных из txt
KarpovStas
27-11-2013, 02:35
Имеется txt файл, в котором в каждой строке находится запись "Количество: 658" (количество в каждой строке может быть любое от 0 до 100000).
Нужно выбрать строки и сохранить их в отдельный txt файл где Количество больше 500.
Буду очень благодарен за помощь.
PowerShell:
Get-Content file.txt | Where {[int]$_.split(":")[1].Trim() -gt 500} | Out-File result.txt
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
Iska, Создаётся почету пустой txt
Kazun, скрипт выполняется с ошибкой так как берет сразу первую запись из строки, но в ней другие данные.
Ошибку можно игнорировать, т.к. файл будет создан, для исключения:
Get-Content file.txt | Where {$_ -match "Количество:" -and [int]$_.split(":")[1].Trim() -gt 500} | Out-File result.txt
KarpovStas
27-11-2013, 11:36
Kazun, еще есть проблема число после символа ":" иногда есть с пробелом например "10 000"
можно как то пробелы игнорировать?
Get-Content file.txt | Where {$_ -match "Количество:" -and [int]$_.split(":")[1].replace(" ","") -gt 500} | Out-File result.txt
KarpovStas
27-11-2013, 12:28
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
3*109 - Теперь и умножение требуется?
KarpovStas
27-11-2013, 12:35
Kazun, "нет 3 109" с пробелом.
Сюда скопировал неверно.
В общем в значениях где есть пробел между цифрами, Ошибка Не удается преобразовать значение в тип "System.Int32". Ошибка: "Входная строка имела неверный формат."
Пример:
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
Kazun, Пример строк:
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 54 403 Еще какой то текст
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
Kazun, работает, но если в "Количество: (находится значения от 1 до 9 )
То Ошибка: Не удается индексировать в массив NULL
Не тот код вставляете, здесь нет массива и подобной ошибки не должно возникать.
KarpovStas
27-11-2013, 14:08
Код что вы мне дали
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-11/27/hbpcfbzt5vc1.png
Тогда приведите строку на которой возникает ошибка.
KarpovStas
27-11-2013, 14:29
в такой строке ошибка
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 1 Еще какой то текст
в такой строке ошибки нет
Текст Текст Текст значения: 543 43 значения_еще: 543 43 Количество: 10 Еще какой то текст
если значения больше 10 то ошибки нет
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
теперь без ошибок, но если значения больше 500 то в save.txt не сохраняет.
Предыдущий скрипт сохранял
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.