Войти

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


Bruce Wayne
06-08-2013, 10:39
Добрый день!

Подскажите, пожалуйста, как реализовать такую задачу. Есть два файла 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
для небольших по размеру файлов и до 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
amel27, спасибо Вам огромное! Хм... call call :D Очень интересная конструкция) А можете, если Вас не затруднит, объяснить принцип работы скрипта?

megaloman
06-08-2013, 14:09
@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
megaloman, и Вам спасибо большое! Ваш вариант мне ближе и доступней ;)

amel27
06-08-2013, 15:43
А можете, если Вас не затруднит, объяснить принцип работы скрипта? »в общих чертах:
первый 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-й файл, добавляет в начало значение переменной массива (выборка из массива по номеру строки) и выводит результат

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
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
Можно поинтересоваться, в чем замысел 4-значного формата индекса?
Возможность вывести в последовательном порядке через set $ ?»всё гораздо проще :clapping:
первый вариант читал в массив оба файла - в этом случае без сортировки не обойтись

Dragokas
08-08-2013, 02:03
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




© OSzone.net 2001-2012