PDA

Показать полную графическую версию : [решено] работа с txt файлами


Anufriev
10-07-2012, 18:57
добрый день форумчане

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

исходный текстовик:
‚ ѓ“ Ѓ**Є* ђ®ббЁЁ Ї® Ќ®ў®бЁЎЁабЄ®© ®Ў«*бвЁ ®Ў*®ў«Ґ*л бЇа*ў®з*ЁЄЁ:
EE_AGENT.DBF ў б®бв*ўҐ ee_dat.arj
EE_BKVID.DBF ў б®бв*ўҐ ee_dat.arj
EE_SR.DBF ў б®бв*ўҐ ee_dat.arj
EE_SRTIP.DBF ў б®бв*ўҐ ee_dat.arj
EE_SRVID.DBF ў б®бв*ўҐ ee_dat.arj
EE_STAKO.DBF ў б®бв*ўҐ ee_dat.arj
HDRUS_TU.DBF ў б®бв*ўҐ hd_list.arj
HD_LIST.DBF ў б®бв*ўҐ hd_list.arj
HD_OKATO.DBF ў б®бв*ўҐ hd_list.arj
PK_SRNET.DBF ў б®бв*ўҐ ee_dat.arj
REGFAULT.dbf ў б®бв*ўҐ regfault.arj
ЋЎ*®ўЁвҐ ‚*иЁ бЇа*ў®з*ЁЄЁ Ќ‘€ ў Џ’Љ Џ‘„ Ё§ Є*в*«®Ј* public

файл на выход (название файла - get.txt):
get public regfault.arj
get public ee_dat.arj
get public hd_list.arj

Anonymоus
11-07-2012, 04:51
@Echo Off
SetLocal EnableDelayedExpansion
For /F "usebackq delims=" %%L In ("test.txt") Do (
For %%A In (%%L) Do (
Set Name=%%A
If /I !Name:~-4!==.arj Echo get !Name!>>get.txt
)
)

Anufriev
11-07-2012, 12:13
спасибо, бат работает, но не совсем так как надо

1. имя файла откуда берется текст upd_nsi_*, если так и написать в место "test.txt" ни чего не происходит (* - разные цифры, формат файла отсутствует)
2. в этом батнике они пишет все имена, даже если они повторяются, мне необходимо, что бы повторные не записывались

Anonymоus
11-07-2012, 12:43
Повторы убраны, перебор файлов по маске добавлен.

@Echo Off
SetLocal EnableDelayedExpansion
For /F "delims=" %%F In ('Dir "upd_nsi_*" /A-D /B') Do (
For /F "usebackq delims=" %%L In ("%%F") Do (
For %%A In (%%L) Do (
Set Name=%%A
If /I !Name:~-4!==.arj (
Type "get.txt" 2>nul|Find "!Name!">nul||Echo get public %%A>>"get.txt"
)
)
)
)
Pause&Exit

alek2012
11-07-2012, 15:08
Anufriev попробуй вот этой штукой Grep (http://gnuwin32.sourceforge.net/packages/grep.htm)

Очень полезная вещь, мне кто то на этом форуме посоветовал.

Anonymоus
11-07-2012, 16:19
alek2012, grep для этой задачи - по моему мнению, излишество, хотя я и пропагандирую его использование везде, где cmd не справляется. Смотрите, скрипт с использованием grep стал короче:

@Echo Off
Set Path=%Path%;%CD%\bin
For /F "delims=" %%F In ('Dir "upd_nsi_*" /A-D /B') Do (
For /F "delims=" %%L In ('grep -Eo "[^ ]*[.]arj" "%%F"') Do (
Type "get.txt" 2>nul|Find "%%L">nul||Echo get public %%L>>"get.txt"
)
)
Pause&Exit

Но при этом скрипт не запустится на любом компьютере (grep - внешняя утилита, её приходится таскать вместе со скриптом, а это около полутора мегабайт, сам exe и требуемые dll), кроме того, бывают случаи, когда использование сторонних утилит запрещено по соображениям безопасности.

Anufriev
11-11-2015, 09:15
Добрый день!

появилась проблема с этим батником, сам он работает стабильно, но файлы начали приходить с именами архивов в верхнем регистре, а выводить в файл "get.txt" нужно в нижнем регистре, не подскажете, как изменить регистр?

FIL.DBF ў б®бв*ўҐ KGRD0922.ARJ
F_ARX.DBF ў б®бв*ўҐ KGRD0922.ARJ
HDRUS_TU.DBF ў б®бв*ўҐ HD_LIST.ARJ
HD_LIST.DBF ў б®бв*ўҐ HD_LIST.ARJ
HD_OKATO.DBF ў б®бв*ўҐ HD_LIST.ARJ

Foreigner
11-11-2015, 11:11
Anufriev,

sed -r "s/.* (.+)$/\L\1/" 1.txt > 2.txt

Anufriev
11-11-2015, 11:22
Foreigner,

Если не ошибаюсь, то это команда из линухи? в винде она не катит:)

Foreigner
11-11-2015, 14:14
Если не ошибаюсь, то это команда из линухи? в винде она не катит
А grep катит? Он тоже из "линухи", если что.

Anufriev
11-11-2015, 14:23
Foreigner, grep судя по написанному сторонняя утилитка и она не используется (запрещено использование стороннего ПО), используется батник написанный чуть выше

Foreigner
11-11-2015, 15:05
Anufriev, Ну тогда через задницу, выбирай:

@echo off
setlocal

for /f "tokens=*" %%i in (1.txt) do call:1 %%i
goto:eof

:1
for %%i in (%*) do set "val=%%i"

cd.>"%tmp%\%val%"

for /f "tokens=*" %%i in ('dir /b /l "%tmp%\%val%"') do 1>>2.txt echo %%i

del "%tmp%\%val%"


@echo off
setlocal

for /f "tokens=*" %%i in (1.txt) do call:1 %%i
goto:eof

:1
for %%i in (%*) do set "val=%%i"

set val=%val:A=a%
set val=%val:B=b%
...
set val=%val:Z=z%

1>>2.txt echo %val%


ЗЫ. PowerShell тоже "низя"?

(get-content 1.txt).foreach({ ($_ -split '\s')[-1].tolower() }) | set-content 2.txt # для posh 4+
get-content 1.txt | foreach { ($x = $_ -split '\s')[$x.length-1].tolower() } | set-content 2.txt # для posh 3-

Anufriev
12-11-2015, 08:23
мне и через задницу пойдет:), огромное спасибо, оба батника работают прекрасно, PowerShell даже не стал проверять




© OSzone.net 2001-2012