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

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

slnt 15-05-2015 02:52 2507519

преобразование формата даты в текстовом файле
 
Доброе время суток!
Столкнулся со следующей проблемой: в каталоге C:\ID находится порядка 30-40 txt файлов в них дата с форматом 31.12.1970, необходимо преобразовать в формат 1970-12-31 желательно во всех файлах разом.

Elven 15-05-2015 09:19 2507589

в названии или в содержимом? если в содержимом какой формат строки?

Iska 15-05-2015 09:24 2507593

Цитата:

Цитата slnt
порядка 30-40 txt файлов в них дата с форматом 31.12.1970 »

Упакуйте два-три таких файла в архив и выложите сюда или на RGhost.

slnt 19-05-2015 00:40 2508872

Вложений: 1
Даты в содержимом файла.
http://forum.oszone.net/attachment.p...1&d=1431985654

Georgio 19-05-2015 22:55 2509185

Код PowerShell:

Код:

gci 'C:\ID\*.txt'|%{
 sc $_ (gc $_|%{
  ($_.Split('\|')|%{
  if(([Regex]::Match($_,'^[0-3]\d\.[01]\d\.[1-9]\d{3}$')).Success){
    $_=(Get-Date $_ -Format 'yyyy-MM-dd')
  };$_
  }) -join '|' -replace '\|$'
 })
}

.

slnt 20-05-2015 00:59 2509225

Цитата:

Цитата Georgio
PowerShell »

Спасибо большое! Все отработало в лучшем виде!

Iska 22-05-2015 21:59 2510409

Georgio, а для чего Вы разбивали строки на составляющие по «.Split()»? Я не пойму цель этого.

Georgio 22-05-2015 22:50 2510427

Iska, да это первое, что в голову пришло: проверить составляющие на соответствие шаблону даты и заменить. А как бы Вы написали?

Iska 23-05-2015 02:53 2510458

Я бы, наверное, сразу во всей строке делал замену, наподобие:
Код:

Get-ChildItem -Path 'C:\Мои проекты\05\ssp\*.txt' | ForEach-Object -Process {
    Set-Content -Path $_ -Value (
        Get-Content -Path $_ | ForEach-Object -Process {
            $_ -replace '(\d{2})\.(\d{2})\.(\d{4})', '$3-$2-$1'
        }
    )
}

Если файлы не слишком большие — быстрее будет и вовсе обойтись без перебора отдельных строк.

greg zakharov 23-05-2015 17:36 2510612

Как вариант можно использовать Select-String, например:
Код:

sls ($r='(\d{2})\.(\d{2})\.(\d{4})') *.txt|%{$p,$s=$_.Path,$_.Line -replace $r, '$3-$2-$1';...}
В переменную $p заносится путь до файла, в $s - измененная строка. Ну, а далее останется все это дело передать на запись.

Iska 23-05-2015 20:23 2510661

Цитата:

Цитата greg zakharov
Как вариант можно использовать Select-String »

Ежели токмо от автора будет подтверждение, что каждая строка обязательно содержит хотя бы одну дату, я так понимаю?


Время: 21:30.

Время: 21:30.
© OSzone.net 2001-