Как читать текстовый файл строка за строкой, которая превышает количество символов в пакетном файле? Допускается ограничение длины строки. (Windows, пакетный скрипт) - PullRequest
2 голосов
/ 03 марта 2020
##test.txt##
First line = 1;*|:12345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345
Second line = 5;*|:3215432;*|:21543215432154321543215432154321543215432154321543215432154321543215;*|:543215;*|:5432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321

SetLocal EnableDelayedexpansion
for /F "tokens=* delims=" %%a in ('type "test.txt"') do (
            set "Line=%%a"
            echo Line: "!Line!"
)

Очевидно, что приведенный выше код не может прочитать 2 строки в test.txt, поскольку каждая строка превышает ограничение (8191 символ).

Путем ввода

type "test.txt"

В результате получилось 2 строки, как в файле test.txt. Однако, как только 2 строки попадают в поле для l oop, строки не могут быть прочитаны.

Мне не нужна вся длина строки, поэтому я попытался предварительно обработать текстовый файл, удалив лишние часть строки. Например, ограничьте длину линии 8100 в приведенном выше примере.

1.Как мне отредактировать указанный выше текстовый файл, не используя блокнот (любые GUI редакторы) в среде windows?

2.Если мне не нужно предварительно обрабатывать файл, Что за хитрость, чтобы избежать вышеуказанной проблемы?

  • Даже я не могу поставить морковь (^), которая расширяет командную строку. То, что я хочу, это хорошо разбить строку и взять первые части, но я не хочу делать это вручную с помощью блокнота или других GUI файловых редакторов.

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

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

@echo off
setlocal EnableDelayedExpansion

set pos=0
set line=
<long_text.txt (
    FOR /F "tokens=1 delims=:" %%1 in ('findstr /o "^" long_text.txt') DO (
        set new_pos=%%1
        set /a size=new_pos-pos
        set /a "chunks=(size-1+1022) / 1023"
        if defined line echo Line: !line! chunks=!chunks!

        set /a pos=new_pos
        for /L %%# in (1 1 !chunks!) do (
            set "partial="
            set /p partial=     
            if defined partial (
                echo   #!line! chunk %%# -- !partial:~0,10! ... !partial:~-10! 
            )
        )
        set /a line+=1
    )
)

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

Внешний FOR /F .. findstr /O l oop используется для определения длины каждой строки путем вычисления позиционной разницы между двумя линиями.
Длина строки используется для вычисления количества кусков , которые необходимо прочитать, чтобы получить всю строку ,

Сама строка читается set /p (она читает из перенаправления <long_text.txt). set /p имеет ограничение в 1023 символа.

Поэтому set /p используется чанк раз.

Чтобы рассчитать, сколько кусков используется для одной строки, длину строки нужно разделить на 1023, но нужно вычесть 1 символ, потому что LF не считается (но CR). +1022 является результатом того факта, что остальные символы после последнего complete чанка должны быть прочитаны тоже.
Последний чанк может быть пустым, если строка кратна 1023 (также пустая строка).

Единственная оставшаяся точка - последняя строка.
Последняя строка не будет прочитана этим методом, но достаточно легко добавить одну пустую строку раньше.

0 голосов
/ 03 марта 2020

Если вы используете поддерживаемую систему Windows, PowerShell будет доступен. Измените 20 на максимальное количество символов в каждой строке.

powershell -NoLogo -NoProfile -Command ^
    "Get-Content -Path '.\longlines.txt' |" ^
        "ForEach-Object { $_.substring(0,[Math]::min($_.Length, 20)) }"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...