![]() |
Как из for получить значение из одной строки смещаясь на 1 при каждом проходе
Условия:
Имею 2 "рафинированных" файла со списками, в первом файле по имени name.txt в каждой строчке имеются строки с названиями, во втором файле имеются айди соответсвующие именам именам в первом файле, то есть айди из первой строки соответствует имени из первой строки, айди из 555 строки id.txt соответствует имени из 555 строки в id. Требуется: Получить в каждом проходе 2 соответствующие друг друг переменных из одной и той же строчки в двух разных файлах, при следующем проходе перезаписать их новыми переменными со следующей строки Код: PHP код:
Первый For получающий имя без всяких проблем каждый цикл переходит к новой строчке пока не достигнет конца файла, с каждым новым проходом я получаю нужно мне имя файла. Но второй цикл For, заключенный внутри первого, при выходе из цикла и возврате в предыдущий из которого уже выводится эхо, всегда дает мне айди из последней строки таким образом разным именам всегда присваивается 1 и тот же айди. Я пробовал перенести эхо внутрь второго цикла, но при этом получался противоположный эффект - я получал 1 и то же имя с разными айди. Я попробовал добавить skip=N и ввел простой счетчик прохода N=N+1 и пытаюсь его значение подставить в качестве значения пропускаемых строк, по логике я на самом деле должен получить такой результат как и до этого (это я уже сообразил после добавления, ведь даже если я начиная с другой строки, все равно цикл закончится последней :D ), но по странной причине ошибка в синтаксисе. Ну в общем не знаю, как заставить внутренний цикл читать одну заданную номерную строчку вместо всех и завершаться. Я где то видел что внутри IN указывали примерно вот таким способом ([1] [555]) номер нужной строчки, но как это совместить с именем файла и каков правильный синтаксис еще и с подстановкой переменной N? П.С. - Как я понял find и findstr в моем случае не получится использовать, так как изначально неизвестно что искать, кроме номера строчки. В общем очень нуждаюсь в помощи, залип с такой простой вещью, а документация что в винде что в нете слишком куцая чтобы найти решение. |
Voodooman, для правильного понимания не хватает примеров всех четырёх файлов: что есть и что нужно получить в итоге.
|
4 файла???
2 же)) Я вроде бы доступно все объяснил, не хочу показаться грубым, но чуть выше все разжевано на пальцах так, что можно обойтись и без примеров и все правильно понять. Но ладно, попробую еще более доступно объяснить: name.txt Код:
name 1 Код:
125162 Код:
name 1=3535 Код:
name 1=125162 |
Voodooman,
Цитата:
Код:
@echo off |
Я уже справился с задачей сам - решил совсем не использовать дампы со списком имен и айди, так как не нашел нормального способа заставить внутренний цикл for обработать одну строчку и завершиться, вместо прохода по всем строчкам, по этому использовал чтение одного ini файла соответсвующего имени напрямую, так хоть во внутреннем for не появляется десяток лишних циклов:
PHP код:
Foreigner, cкрипт работает, но что это за синтаксис такой страшный? Можно пояснения как он работает и в чем моя ошибка? Что делает вот это и зачем оно вообще нужно? <id.txt set /p "firstid=" Зачем выводить первое эхо, ставить две переменных счетка skip и cnt и еще и сравнивать их? Зачем выпрыгивать из цикла for во внешний loop, неужели нет более простого и лаконичного способа прочитать 1 конкретную строку из for и закончить цикл? Можно в более удобоваримом виде и с комментариями? |
Цитата:
Видите ли, коллега, приведение примеров позволяет дать наглядный образец и помогает лучше воспринимать формальный текст поставленного задания. P.S. Можно спросить, например, у Foreigner'а — облегчили ли ему приведённые примеры понимание сути вопроса, или же они лишние? Цитата:
Цитата:
Цитата:
Цитата:
Код:
@echo off |
Цитата:
Цитата:
Код:
@echo off |
Цитата:
Цитата:
|
Цитата:
|
Ну я тут на самом деле эхой из дебаг функции заменил кучу других функций и значительно скрипт сократил, чтобы не отвлекались на ненужные вещи, в данном случае меня интересуе соответсвие строк двух переменных.
Вот сейчас в своем решении без дампа списка файлово решил добавить по мимо считывания имени из названия ини файла и считывания айди из самого инишника, еще и считывания параметра с именем иконки, но вот беда все та же случилась - for начинает парсить все строки непрерывно и в итоге выдает мне последнюю по выходу из его цикла. Я бы мог в 3 форе как и во 2 использовать делиметер с бекслешем и токеном, но вот беда еще в том, что количество бекслешей в искомой строке может различаться в некоорых инишника и соответсвенно я не знаю точно сколько токенов отсчитывать от начала строки, может есть способ отсчитывать токены от конца или число симоволов из нужной строчки от конца отсчитать и взять за переменную? Дело в том что ваши методы джама из for во вне мне не подходят, так как у меня 3 фложенных for и прыжок прервет все 3, я попробовал сделать функцию внутри for b выпрыгнуть лишь за пределы 3го во второй, но увы обломался, похоже cmd не поддерживает таких джампов внутри цикла из более глубокого в менее без прерывания последнего. В общем мне все еще надо считать одну строку из файла и прервать наследующий for не прерывая родительский или заменить какой то командой которая однозначно умеет читать только одну строку. Я поверить не могу что МС выдумывая кучу сложных вещей для бат файла не придумали простого способа задать и исполнить лишь одну строку. Вот как можно прервать один фор после первого или заданного прохода не прерывая второго? Может можно использовать как то skip относительно конца файла? например так skip=3,-3 - не читать первые и последние 3 строчки, а если между ними всего одна, то как раз получается нужный результат. |
Цитата:
Цитата:
|
Не, WSH не стоит, я с ним не знаком и тут мне уже принципиально надо заставить бат файл каким то хитрым способом прочить только одну строчку!)) Я не успокоюсь пока не заставлю его это сделать)))
Решил поискать внешние консольные утилиты для упрощения задачи и поставки их в комплекте вместе с готовым батником, наткнулся на эту утилиту для чтения, изменения и удаления параметров из ини файлов через батники http://www.horstmuc.de/wbat32.htm#inifile Сейчас попытаюсь еще найти более широкопрофильную утилиту, которая может читать заданную строчку в любую сторону, помню мне однажды попадалась такой монстр, который через командную строку умел делать все, найти бы его сейчас и не извращаться со встроенным ограниченным функционалом) Но все же нейтив метод предпочительней, я пока от мук избавляю себя этой прогой, но хочу все равно узнать как выйти из фора внутри фора после 1 прохода по заданной строчке и при этом не выходить из верхнего. Должен же быть способ. Кстати, я забыл, как мне из полученной строки взять и использовать в качестве переменной последние 44 символа без всяких делиметеров и токенов? какие там операторы нужно использовать? |
Цитата:
Код:
for /l %%j in (1,1,%cnt%) do call echo %%names_%%j%%=%%id_%%j%% |
kiripanda, можно и так.
|
А кто нибудь на мои вопросы здесь ответит?))
еще раз спрошу - как взять значение из указанной строчки и прервать лишь 1 фор после этого чтобы избежать парсинга отсальных строк? |
Цитата:
«%systemroot%\system32\wscript.exe» наличествует? Цитата:
Цитата:
Цитата:
|
(флейм удален)
|
Цитата:
|
Voodooman,
Штатными средствами, без счетчиков и не зная содержимое строки, этого сделать нельзя. Для парсинга текста написано много утилит -- sed, awk, grep, gsar и т.д. |
Время: 05:55. |
Время: 05:55.
© OSzone.net 2001-