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
...
Что соответствует:
Возможно ли такое? Я возился с циклами for /l и с командой more, использовал счётчики строк, но так ничего толкового и не добился... А more вообще почему-то не работает на Windows 8 (выдаёт сообщение, что "слишком много аргументов для командной строки" даже при выполнении простой задачи):
Код:
for /f "delims=" %%a in ('more +10 ^<"123.txt"') do echo %%a
|
для небольших по размеру файлов и до 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 Очень интересная конструкция) А можете, если Вас не затруднит, объяснить принцип работы скрипта?
|
Bruce Wayne |
06-08-2013 14:47 2197229 |
megaloman, и Вам спасибо большое! Ваш вариант мне ближе и доступней ;)
|
Цитата:
Цитата 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%
++
Для продолжения нажмите любую клавишу . . .
|
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.%%?%%
)
|
Цитата:
Цитата Diskretor
Можно поинтересоваться, в чем замысел 4-значного формата индекса?
Возможность вывести в последовательном порядке через set $ ? »
|
всё гораздо проще :clapping:
первый вариант читал в массив оба файла - в этом случае без сортировки не обойтись
|
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.
© OSzone.net 2001-