2015-03-23 2 views
2

У меня есть большие текстовые файлы фиксированной длины, столбцы, разделенные двумя пробелами. Мне бы очень хотелось, чтобы пакетный файл сообщал о начале и конце номера столбца для каждого столбца данных на основе первой & последней строки в текстовом файле.Может ли командный файл указать номер столбца найденной строки?

Первая и последняя строка в текстовом файле должны быть одинаковыми (одни и те же байт столбца), и если не сообщать об этом. Иногда для последней строки есть дополнительный возврат каретки, поэтому я уверен, что ее нужно будет проверить и удалить, а затем проанализировать последнюю строку для сравнения с первой строкой.

Линии могут содержать следующие [aA, zZ], [0-9], =, ^,?, \, /,%,;

0000000000 00000 000000000=000000000 KM000000 

выше может сообщить (2 пробела быть разделитель) 10, 2, 5, 2, 19, 2, 8

или отчет диапазон каждого столбца (2 пробела быть разделитель) 1-10,11-12,13-17,18-36,37-38,39-46

Я не уверен, что это даже возможно или где даже начать. Я понимаю, что показ образца кода нужен и предпочтителен, но я просто не уверен, как это сделать с самого начала.

Любая помощь будет оценена по достоинству.

+0

Ваш ожидаемый результат неверен - вам не хватает позиции одного из разделителей. Правильный результат: «1-10,11-12,13-17,18-19,20-38,39-40,41-48'. Но я не понимаю, почему вам нужна позиция разделителей, поскольку они не содержат данных. Это может привести к запутыванию, если столбец данных имеет длину два. – dbenham

ответ

1

Я думаю, что моя JREPL.BAT regular expression text processor может быть большой помощью. Это гибридный JScript/пакетный скрипт, который запускается изначально на любом компьютере Windows с XP.

Обширная документация доступна при запуске jrepl /? из командной строки. Вы можете использовать jrepl /? | more, чтобы получить помощь по одному экрану за раз. Но моя консоль сконфигурирована с большим выходным буфером, поэтому я могу прокручивать вверх, чтобы увидеть предыдущий вывод, поэтому мне не нужно БОЛЬШЕ.

Я считаю, что следующее делает в значительной степени то, что вы хотите. Он анализирует первую и последнюю строки указанного текстового файла и распечатывает список смещений столбцов в каждой строке с разделителями-запятыми. Если он обнаруживает недопустимый символ или что-то иное, чем два пробела между каждым столбцом, то он включает в себя вывод ERROR. Я изменил вывод, чтобы исключить положение двух разделителей пробелов.

Следующая команда должна запускаться из командной строки, если у вас есть JREPL.BAT в папке, включенной в ваш PATH.

jrepl "([a-zA-Z0-9=^?\\/%;]+)(?: )?|.+" "','+($off+1)+'-'+($off+$2.length)|' ERROR'" /c /j /t "|" /jbegln "skip=(ln!=1&&ln!=cnt)" /jendln "$txt=skip?false:$txt.slice(1)" /f test.txt 

Вот выход для вашего текстового файла образца:

1-10,13-17,20-38,41-48 
1-10,13-17,20-38,41-48 

Если поместить команду в пакетном сценарии, то вы должны использовать ВЫЗОВ JREPL, в этом случае проценты должны быть в два раза убежали.

call jrepl "([a-zA-Z0-9=^?\\/%%%%;]+)(?: )?|.+" "','+($off+1)+'-'+($off+$2.length)|' ERROR'" /c /j /t "|" /jbegln "skip=(ln!=1&&ln!=cnt)" /jendln "$txt=skip?false:$txt.slice(1)" /f test.txt 

Как это работает

/f "test.txt" указывает исходный файл, в данном случае «test.txt»

/c подсчитывает количество строк в файле и сохраняет значение в переменной cnt ,

/jbegln ... отключает поиск и замену, если текущая строка равна 1 или cnt, установив skip в значение true.

/jendln ... отключает печать из текущей строки, если skip истинно, в противном случае удаляет начальную запятую с выхода.

/j рассматривает заменяемую строку как код JScript.

/t "|" рассматривает строки поиска и замены как похожие списки выражений, разделенные |. Первое выражение замены используется с первым поисковым выражением, а второе выражение замены используется со вторым поисковым выражением. Поиски обрабатываются слева направо, поэтому второе выражение проверяется только в том случае, если первое не удалось совместить.

Первый аргумент - список выражений поиска.

Второй аргумент - это список замещающих выражений.

Поиск 1: Поиск допустимого столбца с одним или несколькими допустимыми символами, необязательно сопровождаемыми ровно двумя пробелами. Обратите внимание, что первому поисковому выражению присваивается $ 1, поэтому захваченное выражение в круглых скобках (фактический столбец данных) становится $ 2 вместо $ 1.

Замена 1: запятая, за которой следует смещение совпадения (на основе 0) + 1, за которым следует тире, за которым следует смещение совпадения + длина захваченного выражения.

Поиск 2: Ищет строку из любых символов.

Замена 2: строка "ERROR".

+0

Благодарим вас за ответ, и вы уже прошли выше и выше, но когда я запускаю ваш код, не касаясь его от файла test.txt в том же каталоге, что и jrepl.bat, и ваша команда в пакетном файле ... следующая ошибка происходит с выражением регулярного выражения. «Ошибка выполнения JScript в регулярном выражении поиска: Ожидаемое«] »в регулярном выражении« – user2150312

+0

ИСПРАВЛЕНИЕ Я идиот! Я скопировал вашу первую строку кода, а не код партии, который вы поставили вторым. Я сделал это ЗНАТЬ, что ты сказал это и полностью хотел скопировать глупый пакетный код. Во всяком случае, я сожалею, и это полностью ответило на мой вопрос ... Я очень ценю это! Спасибо – user2150312

+0

Вы сказали, что это ошибка, если что-то не соответствует? Я не жалуюсь, этот ответ работает отлично для того, что я хотел, но если ошибка должна произойти, когда первая строка не соответствует последней строке, или если какая-либо строка отличается, это не так. В настоящее время он укажет вам количество байтов для первого и последнего. Не был уверен, допустим ли это ОШИБКА или нет. В любом случае, спасибо. – user2150312