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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Добавление числа после точки с условием

Ответить
Настройки темы
CMD/BAT - [решено] Добавление числа после точки с условием

Старожил


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

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


Изменения
Автор: foma24
Дата: 06-06-2013
Добрый день. Помогите решить такую задачу. Есть файл 111.txt который лежит в C:\ в нем много строк текста. Нужно найти строки вида:

Сумм:30
Сумм:10.1
Сумм:50.03

С этих строках, там, где после точки идет одно число в конце нужно дописать 0, т.е. строка Сумм:10.1 должна стать Сумм:10.10, а там где нет точки добавить точку и два нуля, т.е. вместо Сумм:30 должно стать Сумм:30.00, строку с двумя цифрами после точки оставить без изменений.

Файл с изменениями сохранить в 222.txt

P.S. в принципе можно и не в CMD, а в WHS или PowerShell

Отправлено: 15:01, 06-06-2013

 

Ветеран


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

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


foma24, проверьте:

Код: Выделить весь код
@ECHO OFF>222.txt
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=1,2 delims=." %%I IN (111.txt) DO (
   SET VAR1=%%J
   IF DEFINED VAR1 (
    SET VAR2=!VAR1:~1!
    IF DEFINED VAR2 (
     ECHO %%I.%%J>>222.txt
  ) ELSE (
     ECHO %%I.%%J0>>222.txt
)) ELSE (
    ECHO %%I.00>>222.txt
))
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:43, 06-06-2013 | #2



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

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


Старожил


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

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


Большое спасибо, только небольшое уточнение, нужно чтобы батник обрабатывал только строки с началом Сумм, т.е. например если в строке будет не Сумм:30 а Итог:30 то такую строку трогать не нужно, она должна в первозданном виде сохраниться в файл 222.txt

Отправлено: 16:07, 06-06-2013 | #3


Ветеран


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

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


Цитата foma24:
Есть файл 111.txt »
Кодировку файла укажите.

У меня какой-то тихий ужас получился:
читать дальше »
Код: Выделить весь код
$sPath = "E:\Песочница\0269\111.txt"

$aContent = (
    Get-Content -Path $sPath |`
        ForEach-Object -Process {
            switch -regex ($_) {
                "^Сумм:\d+[^\d.]*$" {
                    $_ -replace "^(Сумм:\d+)([^\d.]*)$", '${1}.00${2}'
                    break
                }
                    
                "^Сумм:\d+\.\d[^\d.]*$" {
                    $_ -replace "^(Сумм:\d+\.\d)([^\d.]*)", '${1}0${2}'
                    break
                }
                default {
                    $_
                }
            }
        }
)
    
Set-Content -Path $sPath -Value $aContent
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:31, 06-06-2013 | #4


Старожил


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

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


Цитата Iska:
Кодировку файла укажите. »
OEM866

Отправлено: 16:41, 06-06-2013 | #5


Ветеран


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

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


Цитата foma24:
OEM866 »
Попробуйте так:
читать дальше »
Код: Выделить весь код
function StrConvert($sSourceCharset, $sDestCharset) {
    begin {
        Set-Variable -Name adTypeText      -Option Constant -Value 2
        Set-Variable -Name adModeReadWrite -Option Constant -Value 3
        
        $oStream = New-Object -ComObject "ADODB.Stream"
    }
    
	process {
        $oStream.Type = $adTypeText
		$oStream.Mode = $adModeReadWrite
		
		$oStream.Open()
		
		$oStream.Charset = $sSourceCharset
		$oStream.WriteText($_)
		
		$oStream.Position = 0
		$oStream.Charset  = $sDestCharset
		$oStream.ReadText()
		
		$oStream.Close()
	}
}

$sPath = "E:\Песочница\0269\111.txt"

$aContent = (
    Get-Content -Path $sPath  |`
        StrConvert "windows-1251" "cp866" |`
            ForEach-Object -Process {
                $sConvertedString = ($_  )
                
                switch -regex ($sConvertedString) {
                    "^Сумм:\d+[^\d.]*$" {
                        $sConvertedString -replace "^(Сумм:\d+)([^\d.]*)$", '${1}.00${2}'
                        break
                    }
                        
                    "^Сумм:\d+\.\d[^\d.]*$" {
                        $sConvertedString -replace "^(Сумм:\d+\.\d)([^\d.]*)", '${1}0${2}'
                        break
                    }
                    default {
                        $sConvertedString
                    }
                }
            } |`
    StrConvert "cp866" "windows-1251"
)
    
Set-Content -Path $sPath -Value $aContent
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:40, 06-06-2013 | #6


Ветеран


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

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


Код: Выделить весь код
@ECHO OFF>222.txt
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=*" %%I IN (111.txt) DO (
  FOR /F "tokens=1,3 delims=:." %%J IN ("%%I") DO (
   IF %%J==Сумм (
    SET VAR1=%%K
    IF DEFINED VAR1 (
     SET VAR2=!VAR1:~1!
     IF DEFINED VAR2 (
      ECHO %%I>>222.txt
   ) ELSE (
      ECHO %%I0>>222.txt
 )) ELSE (
     ECHO %%I.00>>222.txt
)) ELSE (
    ECHO %%I>>222.txt
)))
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:48, 06-06-2013 | #7


Старожил


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

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


Огромное спасибо все прекрасно работает.

Если можно еще одна задачка, файлы внутри такие же, но их много, хранятся в одной папке, нужно в этой папке отобрать все файлы где есть строки вида
Сумм:30
Сумм:10.1
т.е. либо без точки, либо с одной цифрой после точки и скопировать в отдельный каталог

Отправлено: 17:49, 06-06-2013 | #8


Ветеран


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

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


Кодировка та же? Пробуйте:
читать дальше »
Код: Выделить весь код
function StrConvert($sSourceCharset, $sDestCharset) {
    begin {
        Set-Variable -Name adTypeText      -Option Constant -Value 2
        Set-Variable -Name adModeReadWrite -Option Constant -Value 3
        
        $oStream = New-Object -ComObject "ADODB.Stream"
    }
    
	process {
        $oStream.Type = $adTypeText
		$oStream.Mode = $adModeReadWrite
		
		$oStream.Open()
		
		$oStream.Charset = $sSourceCharset
		$oStream.WriteText($_)
		
		$oStream.Position = 0
		$oStream.Charset  = $sDestCharset
		$oStream.ReadText()
		
		$oStream.Close()
	}
}

$sPath = "E:\Песочница\0269"

Get-ChildItem -Path $sPath\*.* -Include *.txt |`
    ForEach-Object -Process {
        if((Get-Content -Path $_ | StrConvert "windows-1251" "cp866") -match "^Сумм:\d+(?:\.\d)?[^\d.]*$") {
            $_ | Move-Item -Destination "E:\Песочница\0270"
        }
    }
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:03, 06-06-2013 | #9


Ветеран


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

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


Код: Выделить весь код
@ECHO OFF
(
 ECHO Сумм:[0-9][0-9]
 ECHO Сумм:[0-9][0-9]\.[0-9]
)>temp.txt
FOR %%I IN ("E:\Folder 1\*") DO (
 FINDSTR /R /E /G:temp.txt "%%~I">nul&&^
COPY "%%~I" "E:\Folder 2\">nul
)
DEL temp.txt

Последний раз редактировалось Georgio, 07-06-2013 в 04:05.

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

Отправлено: 22:18, 06-06-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Добавление числа после точки с условием

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Замена и добавление числа в txt файле Tsok Скриптовые языки администрирования Windows 0 17-10-2011 17:22
2008 R2 - [решено] После добавление компьютера в домен не запускаются программы mr.Den Windows Server 2008/2008 R2 6 21-07-2010 12:36
Прочие БД - Добавление нулей слева от числа Jonik-Mnimonik Программирование и базы данных 2 04-12-2008 09:51
две точки 2000AP+(a1+a2) и карта 650+ хочу репитер из точки Soft_warrior Microsoft Windows NT/2000/2003 0 03-05-2006 21:53
Оптимизация MFS после удаления большого числа файлов Vlad Drakula Microsoft Windows 2000/XP 6 25-11-2004 11:46




 
Переход