2015-03-13 3 views
0

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

Я хочу разбить мой текстовый файл на заданный разделитель (я использую ~ как мой разделитель) на новую строку и вывести результаты в другой текстовый файл. Файл ближайшие будет выглядеть так:

line1~line2~line3~line4~etc~ 

Все пути, например, до 5000 символов. Я хотел бы, чтобы результаты выглядеть следующим образом:

line1~ 
line2~ 
line3~ 
line4~ 
etc~ 

Вот мой текущий код:

@echo off 
set /p input=<input.txt 
call :parse "%input%" 
pause 
goto :eof 

:parse 
setlocal 
set var=%~1 
for /F "tokens=* delims=~" %%a in ("%var%") do (
    if not "%%a" == "" call :splitVar "%%a" 
    if not "%%b" == "" call :parse "%%b" 
) 
endlocal 
pause 
goto :eof 

:splitVar 
setlocal 
echo %~1 
set filename=%~1 
goto :eof 

Есть ли способ преодолеть ограничение в 1024 символов или каким-то образом, чтобы разобрать его таким образом?

Кроме того, дайте мне знать, если этот вопрос противоречит правилам. Я вроде как новый для stackoverflow.

+1

Существует немного кривой обучения, но вы рассмотрели использовать что-то вроде [PowerShell] (https://technet.microsoft.com/en-us/scriptcenter/powershell.aspx), что значительно более мощный, чем командная оболочка? –

ответ

1
@ECHO OFF 
SETLOCAL 
FOR /f "delims=" %%a IN (q2904836.txt) DO call :parse "%%a" 
pause 
goto :eof 

:parse 
setlocal 
set var=%~1 
:parseloop 
IF DEFINED var for /F "tokens=1* delims=~" %%a in ("%var%") do (
    if not "%%a" == "" call :splitVar "%%a"&SET "var=%%b"&GOTO parseloop 
) 
endlocal 
pause 
goto :eof 

:splitVar 
setlocal 
echo %~1 
set filename=%~1 
goto :eof 

Я использовал файл с именем q2904836.txt, содержащий некоторые данные для моего тестирования.

Существует ограничение на размер стека, и вы вызываете :parse для каждой записи в вашей строке, что приведет к ограничению.

Обратите внимание на использование tokens=1*, назначив следующий токен %%a, а оставшуюся часть линии - %%b.

Использование for/f в соответствии с продемонстрированным вариантом преодолеет предел 1024 - но есть еще предел чуть более 8100 символов. Обратите внимание, что ваши setlocal/endlocal в :parse и setlocal/implicit-endlocal in ': splitvar` означают, что переменные, которые могут быть установлены или изменены в этих подпрограммах, будут отброшены.

+0

Спасибо, это работает. Я обнаружил, что мне пришлось немного изменить его, чтобы принять специальные символы. К сожалению, похоже, что я столкнулся с проблемой с лимитом 8100 символов с файлом, имеющим колоссальные символы 179708. Мне, возможно, придется задуматься о том, чтобы ограничить его только запуском с файлами длиной 8100 символов или короче или найти другое решение для преодоления этого (возможно, с использованием другого языка). – grinjr

0

Предел не в 1024, то в 8191

Расщепление работает немного по-другому, чем вы думали.

Он разбивается на несколько токенов, но вам нужно другое решение.

Вы можете заменить все знаки линейными переводами, чем получить желаемый результат.

Setlocal enabledelayedexpansion 
Set LF=^ 


for %%a in ("!LF!") do set var=!var:-=%%a! 
For /f "delims=" %%a in ("!var!") Do echo %%a 
+0

Ум - не так. Метод 'set var = Magoo

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