2014-12-22 2 views
0

У меня есть несколько файлов, которые я запускаю с пакетным файлом, который перебирает всех в каталоге и выгружает определенные данные в таблицу sql. Я добавляю в метку времени, что я перехожу в переменную и пытаюсь добавить в таблицу sql, используя sqlcmd, единственная проблема заключается в том, что для добавления во все соответствующие столбцы для этой записи мне нужно передать имена файлов которые добавляются в таблицу sql.Использование findstr для перехода к переменной

Хорошо, вот уловка ... имена, добавляемые в таблицу sql, не являются фактическими именами файлов, а именами баз данных, которые могут быть найдены в каждом из этих xml-файлов (достаточно близко к xml). Поэтому я знаю, где это, и каждый из них выглядит примерно так: abcdir (остальное имя), где abcdir - это строка, которая запускает каждую отдельную базу данных.

Поэтому я думал, что могу использовать функцию findstr для получения имени базы данных, но у меня очень мало опыта с регулярным выражением, и я бы хотел, чтобы вы могли анализировать теги и оставались только с именем = abcdir (остальные имя)

** * Я не думал, что какой-либо из моих кодов действительно понадобится, так как я просто задаю вопросы о конкретной команде, но если это не так, дайте мне знать, и я отправлю его * **

EDIT: Хорошо, поэтому каждый файл будет иметь что-то вроде этого, если его открыть в блокноте.

<Name>ABCDir Sample Name</Name> 

или

<Name>ABCDir Sample Name2</Name> 

, и я хотел бы ABCDir Sample имени будут переданы переменным пакет. Поэтому я решил использовать findstr. У меня очень мало схватывания регулярного выражения, но я попытался с помощью findstr >ABCDir[A-Za-z] \path\filename.ext

+0

'findstr' полезно найти строки, содержащие строки, но он не вернет * только * совпадение. Он всегда возвращает всю строку. Вам может понадобиться проанализировать строку с помощью 'for/f 'delims = <>" 'или что-то. Лучше всего было бы использовать [gnuwin32 grep] (http://gnuwin32.sourceforge.net/packages/grep.htm) и 'grep -Eio 'name = [^"] +' или подобное. Но да, я подумайте, что было бы полезно, если бы вы могли опубликовать какой-то пример достаточно близко XML, а также код, который вы пытались очистить, что не удалось. – rojo

+0

Я добавил редактирование. Одна проблема, которую я имел с findstr что у меня нет одного файла слов, и кажется, что если я вложу в findstr \ path \ Это мой файл name.ext Он вернет 'FINDSTR: не может открыть путь FINDSTR: не удается открыть этот FINDSTR: не удается открыть 'и так далее – David

ответ

1

Как я заметил выше, findstr (или find) позволят вам скрести строки, содержащие <Name> из текстового файла, и for /f "delims=<>" позволит вам разделить эти строки в подстроки. С findstr /n вы ищете "tokens=3 delims=<>", чтобы получить строку между <Name> и </Name>.

Попробуйте это:

@echo off 
setlocal 

set "file=temp.txt" 

for /f "tokens=3 delims=<>" %%I in ('findstr /n /i "<Name>" "%file%"') do (
    @echo %%I 
) 

Я использую /n с findstr вставить номера строк. Номера не нужны, но коммутатор гарантирует, что всегда есть токен до <Name>. Поэтому нужная строка всегда tokens=3, независимо от того, имеет ли строка отступы или нет. В противном случае ваша строка может быть маркером 3, если отступом или маркером 2, если нет. Это проще, чем пытаться определить, являются ли теги отступом или нет.

+0

Это выглядит блестящим, но я в замешательстве.Я предполагаю, что 'find' - это то, что вы используете для поиска соответствующего теста, но как он ищет правильную информацию? – David

+0

'findstr' отображает только строки из'% file% ', которые содержат' '. Цикл 'for/f' делает материал с каждой строкой, выводимой' findstr'. – rojo

+0

Можете ли вы объяснить несколько частей этого? ''% File = temp.txt% "', '" "' и '"% file% "'? Является ли имя и% file% только владельцами мест? – David

Смежные вопросы