Как прочитать файл с разделителями-запятыми и вывести результаты на 3 в одной строке - PullRequest
0 голосов
/ 16 января 2019

У меня есть текстовый файл, который содержит более 25 тыс. Записей и выглядит так в одной строке:

cr:121,cr:122,cr:123,cr:124,cr:221,cr:222,cr:223,cr:224,cr:225,cr:321, and so on..

Я хотел бы создать пакетный файл для чтения значений, разделенных запятыми, и выводить их в новом файле с помощью пакета из 3.

Ожидаемый результат: newfile.txt

cr:121,cr:122,cr:123
cr:124,cr:221,cr:222
cr:223,cr:224,cr:225
cr:321

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

Я сейчас пытаюсь

for /f "usebackq tokens=1-4 delims=," %%a in ("algtest_extract.txt") do (
echo %%a %%b %%c %%d )

но это работает только для файлов с несколькими строками. Это дает мне первые 4 значения, а затем выходит.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я не удержался, чтобы написать пакетный скрипт для выполнения вашей задачи. Данный скрипт называется reshape.bat, предоставьте входной текстовый файл в качестве аргумента командной строки, например:

reshape.bat "algtest_extract.txt"

Чтобы сохранить выходные данные в другом файле, скажем algtest_reshaped.txt, сделайте следующее:

reshape.bat "algtest_extract.txt" > "algtest_reshaped.txt"

Вот код (см. Все пояснительные замечания):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_FILE=%~1" & rem // (file to process; `%~1` means first argument)
set "_COL=3"    & rem // (number of columns in the output data)
set "_SEP=,"    & rem // (separator character for input and output data)
set "_PAD="     & rem // (if defined, fill up last row with empty cells)

rem // Read from file:
< "%_FILE%" call :PROCESS

endlocal
exit /B


:PROCESS
    rem // Initialise variables:
    set "REST=" & rem // (remaining text string after the first separator)
    set "LINE=" & rem // (row collector for line/row to output)
    set "IDX=0" & rem // (column counter for output data)
    setlocal EnableDelayedExpansion
:READ
    rem // Read some text, 1023 characters/bytes at most:
    set "STR=" & set /P STR=""
    rem // Terminate loop if no more data are available:
    if not defined STR goto :END
    rem // Precede with potential remainder from previous loop:
    set "STR=!REST!!STR!"
:PARSE
    rem // Extract everything behind the first separator:
    if defined STR set "REST=!STR:*%_SEP%=!"
    rem // No separator had been found, so read more text:
    if "!REST!"=="!STR!" goto :READ
    rem // Extract part in front of first separator:
    for /F "delims=%_SEP%" %%I in ("ITEM=!STR!") do set "%%I"
    rem // Increment column counter:
    set /A "IDX+=1" & if !IDX! lss %_COL% (
        rem // Output line/row not yet complete, so go on assembling:
        set "LINE=!LINE!%_SEP%!ITEM!"
    ) else (
        rem // Output line/row complete, hence return it:
        echo(!LINE:*%_SEP%=!%_SEP%!ITEM!
        rem // Reset row collector and column counter:
        set "LINE=" & set /A "IDX=0"
    )
    rem // Keep on parsing using the remainder:
    set "STR=!REST!" & goto :PARSE
:END
    rem // Return potential remaining data:
    if defined _PAD (set /A "IDX=_COL-IDX-1") else (set /A "IDX=0")
    set "LINE=!LINE!%_SEP%!REST!"
    for /L %%I in (1,1,%IDX%) do set "LINE=!LINE!%_SEP%"
    if defined LINE echo(!LINE:*%_SEP%=!
    endlocal
0 голосов
/ 16 января 2019

В блокноте ++ нажмите Ctrl+H, установите режим поиска в "Regular expression", затем используйте шаблон поиска

([^,]+,[^,]+,[^,]+),

и повторите с

\1\n

UPD

используйте шаблон поиска ((?:[^,]+,){500}), если вы хотите использовать 500 элементов вместо 3. Запятые в конце каждой строки можно заменить с помощью шаблона поиска ,$

...