Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
LogicKiller
0 / 0 / 0
Регистрация: 20.07.2013
Сообщений: 2
#1

Сравнение текстовых файлов

20.07.2013, 14:13. Просмотров 817. Ответов 3
Метки нет (Все метки)

Имеетеся батник, который считывает строку из одного текстового файла, сравнивает ее с аналогичной строкой из 2гого файла, и если строки разные, копирует строку из 1го файла в 3й, если одинаковые - копирует из 2го в 3й.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo on
setlocal enabledelayedexpansion
echo D>russ1.txt
for /L %%i in (59233,1,65503) do (
  for /f "usebackq  delims=" %%z in (`find /v "" dollar.txt ^| find "%%i,"`) do (
    set string=%%z
  )
  set a=!string:~0,5!
 
  for /f "usebackq  delims=" %%f in (`find  /v "" russ.txt ^| find "%%i,"`) do (
    set stringus=%%f
  )
  set b=!stringus:~0,5!
 
  if "!a!" == "%%i" (
    if "!a!" == "!b!" (
      echo !stringus!>>russ1.txt
    )
    if not "!a!" == "!b!" (
      echo !string!>>russ1.txt
      echo !string!>>engg.txt
    )
    echo !string!
    echo !stringus!
    pause
  )
)
но столкнулся с трудностью
В первом файле встречаются строчки типа:
Bash
1
63907, $LDP01!(F:F 0000 0800)
во время присвоения переменной string, ей присваивается значение
Bash
1
63907, $LDP01F 0000 0800)
тоесть вырезается !(F.
Случается это только в тех строчках, в которых присутствует символ $. Например из строчки
Bash
1
59264, "70=$IMC53!(127)
пропадает только знак восклицания !
Подскажите как заставить программу присваивать переменной полное значение. Возможно нужно использовать передачу параметров в другие батники или чтото в этом роде, главное чтоб не сьедались символы в строках с долларом. Заранее спасибо.

Добавлено через 1 час 6 минут
Точнее проблема не в присвоении переменной, а в выводе ее на экран либо в файл командой echo. Именно команда echo сьедает эти символы. Вопрос все тот же - как обойти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2013, 14:13
Ответы с готовыми решениями:

Сравнение содержимого набора текстовых файлов
Уважаемые знатоки, не откажите в помощи новичку! Задача такова - необходимо...

Сравнение содержимого двух текстовых файлов построчно
Доброго всем дня. Есть три текстовых файла. В первом 1.txt - список "зеленых"...

Сравнение текстовых файлов и создание символических ссылок на имеющие различия
Задание: Сравнить текстовые файлы дерева, содержащие искомую...

Сравнение файлов в папке и создание папок с именами файлов
Нужно пройтись по папке, если есть картинка с названием, но нет папки с таким...

Перекодировка текстовых файлов
Сбрасывают на диск файлы txt в кодировке OEM-866 и WIN-1251, нужен батник...

3
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
20.07.2013, 22:58 #2
echo не при чем.

! воспринимается директивой enabledelayedexpansion в строках 6 и 11 Вашего кода в роле служебного символа.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo off
setlocal enableextensions
echo D>russ1.txt
for /L %%i in (59233,1,65503) do (
  setlocal disabledelayedexpansion
  for /f "delims=" %%z in ('find "%%i," ^< "dollar.txt"') do (
    set "string=%%z"
  )
  for /f "delims=" %%f in ('find "%%i," ^< "russ.txt"') do (
    set "stringus=%%f"
  )
  setlocal enabledelayedexpansion
  set "a=!string:~0,5!"
  set "b=!stringus:~0,5!"
 
  if "!a!"=="%%i" (
    if "!a!"=="!b!" (
      echo !stringus!>>"russ1.txt"
    ) else (
      echo !string!>>"russ1.txt"
      echo !string!>>"engg.txt"
    )
    echo !string!
    echo !stringus!
    pause
  )
)
1
LogicKiller
0 / 0 / 0
Регистрация: 20.07.2013
Сообщений: 2
22.07.2013, 12:20  [ТС] #3
Так как строчек в файле 65к, засовывать сетлокал в цикл не получается, выдает достигнут уровень рекурсии максимально возможный...
Возможно можно решить задачу путем экранирования знака восклицания?
И я не совсем правильно сформулировал назначение программы, на выходе должен получиться файл, в котором есть все строки из 2го файла и все те строки из 1го файла, которых нету во втором файле.

Добавлено через 27 минут
По идее достаточно поставить правильно endlocal, но я не разобрался где именно нужно, во всех вариантах ошибка повторяется. Временно решил проблему экранированием ^! в редакторе через заменить все. Думаю нужно сначала создать цикл, который методами cmd это сделает, а потом запускать основную программу.
заодно подскажите как очистить файл перед тем, как в него будут дописываться строчки, кроме удаления файла.
0
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,862
Записей в блоге: 16
22.07.2013, 19:20 #4
Очистка файла.
Bash
1
<null set /p x=> "файл"
Цитата Сообщение от LogicKiller Посмотреть сообщение
копирует строку из 1го файла в 3й, если одинаковые - копирует из 2го в 3й.
В этой части задания были противоречия, поэтому я особо не стал вникать в него - просто переписал код в более простом виде, убрав ошибку с (!).

На счет множественных SetLocal. Вполне возможно. Я считал, что Disable... должен отменять действие предыдущего, но по видимому треубуется явно указать Endlocal вместо строки 5.

Будет время - взгляну еще раз на задание.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2013, 19:20

Архивация текстовых файлов
Привет всем!!! У меня такая проблема на работе ... есть папка и там под папки и...

Редактирование текстовых файлов в cmd
Добрый день, коллеги. Есть простенькая задача, которую можно запилить через...

Создание текстовых файлов по очереди
Нужно сделать 4 текстовых файлов с содержанием &quot;Отличный результат&quot; но так,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru