PDA

Показать полную графическую версию : [решено] Удалить строки из тхт файлов, номера которых указаны в другом тхт файле


Alexander_88
14-02-2016, 09:10
Здравствуйте, подскажите, пожалуйста как сделать следующую задачку:

Есть тхт файл iskl.txt, в котором прописаны номера строк (цифры), каждый номер с новой строки.. пример такого файла:

2
3
8

Также есть два тхт файла в которых нужно удалить номера строк:
fileslink.txt
har.txt

и еще один тхт файл imagelink.txt в котором нужно удалить две строки, для каждого номера, притом удалять нужно строки, полученные из вычисления.. номер указанный в файле iskl.txt умноженный на 2. (это одна строка на удаление) А также вышестоящую строку. (это вторая строка на удаление).
К примеру для номера 3 (указанного в iskl.txt), нужно будет удалить 6ую и 5ую строку.

Пример:
пусть во всех трех тхт файлах будет один и тот же текст
1строка
2строка
3строка
4строка
5строка
6строка
7строка
8строка
9строка
10строка
11строка
12строка
13строка
14строка
15строка
16строка
17строка

В файле iskl.txt стоят номера:

2
3
8

После применения скрипта, файлы fileslink.txt и har.txt, должны стать такими:

1строка
4строка
5строка
6строка
7строка
9строка
10строка
11строка
12строка
13строка
14строка
15строка
16строка
17строка

А файл imagelink.txt должен стать таким:
1строка
2строка
7строка
8строка
9строка
10строка
11строка
12строка
13строка
14строка
17строка

Примечания:
В тхт файлах может быть любой текст, а не только тот, который я написал.
Не должно оставаться пустых строк.
Перед удалением строки нужно учитывать оригинальные номера строк, которые были в самом начале. Т.е. НЕ должно получиться так:

был файл:
строка1
строка2
строка3
и номера удаления 2 и 3.
сначала скрипт удалил 2ую строку, но потом не удалил 3ю строку, т.к. после удаления второй в тхт файле осталось лишь две строки
строка1
строка3
и попросту скрипт не нашел третью строку. Такого быть не должно, номера строк должен учитываться из оригинального файла, который еще не отредактирован скриптом. :)

Foreigner
14-02-2016, 10:26
$a = gc fileslink.txt
$b = gc har.txt
$c = gc imagelink.txt
$d = [int[]](gc iskl.txt)

foreach ($i in $d)
{
$a[($i - 1)] = $null
$b[($i - 1)] = $null
$c[($i * 2 - 1)] = $null
$c[($i * 2 - 2)] = $null
}

$a | sc fileslink.txt
$b | sc har.txt
$c | sc imagelink.txt

Alexander_88
14-02-2016, 10:41
спасибо, работает, проверил :)

greg zakharov
14-02-2016, 10:45
@echo off
setlocal enabledelayedexpansion
for /f %%i in (iskl.txt) do set "i=!i!%%i|"
set "i=^^[!i:~0,-1!]"

call:delStr fileslink.txt
call:delStr har.txt

set "a=0"
for /f %%i in (iskl.txt) do (
if !a! equ 1 set "i=%%i"
set /a "a+=1"
)
set /a "a=!i!*2"
set "i=^^[!i!-!a!]"

call:delStr imagelink.txt
endlocal
exit /b

:delStr
for /f %%i in ("%1") do set "out=%%~dpni.processed%%~xi"
>!out! (findstr /nirc:".*" %1 | findstr /vrc:"!i!")
exit /b

Alexander_88
14-02-2016, 11:21
спасибо, бат тоже нужен, только не пойму, как он работает:

для простого примера создал файлы:
fileslink.txt и har.txt такие:

1
2
3
4
5
6
7
8
9
10


и imagelink.txt такой:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


файл iskl.txt такой:

5
7


после выполнения скрипта, файлы imagelink.txt, fileslink.txt, har.txt не изменились.

Также создались три файла:

fileslink.processed.txt, har.processed.txt такие:
1:1
2:2
3:3
4:4
6:6
8:8
9:9
10:10

а также imagelink.processed.txt такой:
1:1
2:2
3:3
5:5
6:6
7:7
8:8
9:9
10:10
11:11
12:12
13:13
14:14
15:15
16:16
17:17
18:18
19:19
20:20


:(




© OSzone.net 2001-2012