Компьютерный форум 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=265634)

Bruce Wayne 06-08-2013 10:39 2197073

Чтение из двух файлов с выводом в один
 
Вложений: 2
  • 123.txt (829 bytes, скачиваний: 17)
  • 456.txt (831 bytes, скачиваний: 17)
Добрый день!

Подскажите, пожалуйста, как реализовать такую задачу. Есть два файла 123.txt и 456.txt (см. вложение) с числом на каждой строчке, а нужно получить файл 789.txt с таким содержанием:

Код:

Первое число из 123.txt#Первое число из 456.txt
Второе число из 123.txt#Второе число из 456.txt
Третье число из 123.txt#Третье число из 456.txt
...

Что соответствует:

Код:

1#3
5#7
9#10
...

Возможно ли такое? Я возился с циклами for /l и с командой more, использовал счётчики строк, но так ничего толкового и не добился... А more вообще почему-то не работает на Windows 8 (выдаёт сообщение, что "слишком много аргументов для командной строки" даже при выполнении простой задачи):

Код:

for /f "delims=" %%a in ('more +10 ^<"123.txt"') do echo %%a

amel27 06-08-2013 11:48 2197117

для небольших по размеру файлов и до 9999 строк:
Код:

@echo off
(
for /f "tokens=1,2 delims=[] " %%a in ('^<123.txt find /n /v ""') do (
  set "$a=000%%a"
  call set "$%%$a:~-4%%=%%b"
)
for /f "tokens=1,2 delims=[] " %%a in ('^<456.txt find /n /v ""') do (
  set "$a=000%%a"
  call call echo %%%%$%%$a:~-4%%%%%%#%%b
))>789.txt


Bruce Wayne 06-08-2013 13:08 2197157

amel27, спасибо Вам огромное! Хм... call call :D Очень интересная конструкция) А можете, если Вас не затруднит, объяснить принцип работы скрипта?

megaloman 06-08-2013 14:09 2197206

После интереснейшего решения amel27 размещаю своё, так как просто жаль выбрасывать бесследно в корзину
Код:

@Echo Off

SetLocal EnableExtensions EnableDelayedExpansion

Set "Skip="
Set /A N=0

Del 789.txt 2>Nul

FOR /F "%Skip% usebackq delims=" %%i IN (123.txt) DO (
        Call :Continue %%i !Skip!
        Set /A N=!N!+1
        Set "Skip=skip=!N!"
)
GoTo :Eof

:Continue
        FOR /F "%Skip% usebackq delims=" %%j IN (456.txt) DO (
                >>789.txt Echo %1#%%j
                GoTo :Eof           
        )


Bruce Wayne 06-08-2013 14:47 2197229

megaloman, и Вам спасибо большое! Ваш вариант мне ближе и доступней ;)

amel27 06-08-2013 15:43 2197264

Цитата:

Цитата Bruce Wayne
А можете, если Вас не затруднит, объяснить принцип работы скрипта? »

в общих чертах:
первый FOR считывает содержимое 1-го файла в массив переменных (префикс имени $):
Код:

for /f "tokens=1,2 delims=[] " %%a in ('^<123.txt find /n /v ""') do (
  set "$a=000%%a"
  call set "$%%$a:~-4%%=%%b"
)

SET $

можно обойтись и без FIND - обычным счетчиком строк в переменной,
второй FOR построчно читает 2-й файл, добавляет в начало значение переменной массива (выборка из массива по номеру строки) и выводит результат

Цитата:

Цитата Bruce Wayne
call call :D Очень интересная конструкция)

Код:

@echo off

set "$1=++"
set "$2=$1"
set "$3=$2"

set $
pause

echo %$3%
echo %%%$3%%%
call echo %%%$3%%%
call echo %%%%%%%$3%%%%%%%
call call echo %%%%%%%$3%%%%%%%

pause

результат:
Код:

$1=++
$2=$1
$3=$2
Для продолжения нажмите любую клавишу . . .
$2
%$2%
$1
%$1%
++
Для продолжения нажмите любую клавишу . . .


Dragokas 07-08-2013 02:45 2197621

amel27, приветствую.
Можно поинтересоваться, в чем замысел 4-значного формата индекса?
Возможность вывести в последовательном порядке через set $ ? В самом коде по сути можно без этого?

megaloman, синхронное чтение - супер !

И вариант от меня:

Код:

@echo off
Setlocal EnableExtensions
set src1=123.txt
set src2=456.txt
set dest=789.txt

for /f %%? in ('find /c /v "" ^< "%src1%"') do set lines=%%?

< "%src1%" (
  for /l %%? in (1 1 %lines%) do set /p "$1.%%?="
)
< "%src2%" > "%dest%" (
  for /l %%? in (1 1 %lines%) do set /p "$2.%%?="& call echo %%$1.%%?%%#%%$2.%%?%%
)


amel27 07-08-2013 05:21 2197630

Цитата:

Цитата Diskretor
Можно поинтересоваться, в чем замысел 4-значного формата индекса?
Возможность вывести в последовательном порядке через set $ ?»

всё гораздо проще :clapping:
первый вариант читал в массив оба файла - в этом случае без сортировки не обойтись

Dragokas 08-08-2013 02:03 2198246

ORLY ?

Код:

@echo off
SetLocal EnableExtensions
(
  for /L %%? in (1,1,9999) do echo %%?
) > 123.txt
copy /y 123.txt 456.txt

for /f "tokens=1* delims=[]" %%a in ('^<123.txt find /n /v ""') do set "$%%a=%%b"
(
for /f "tokens=1* delims=[]" %%a in ('^<456.txt find /n /v ""') do call echo/%%$%%a%%#%%b
)>789.txt



Время: 20:05.

Время: 20:05.
© OSzone.net 2001-