Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как разрезать текстовый файл на колонки? (http://forum.oszone.net/showthread.php?t=331523)

ruslaw 29-11-2017 14:04 2780979

Как разрезать текстовый файл на колонки?
 
Имеется input.txt:
15a
26b
37c
48d
Как получить
output1.txt:
1
2
3
4
output2.txt:
5
6
7
8
output3.txt
a
b
c
d

alpap 29-11-2017 16:24 2781009

Код:

@echo off
<input.txt (for /f "delims= eol=" %%a in ('more') do @set "s=%%a"& call :#)
pause& exit

:#
 setlocal enabledelayedexpansion
  for %%a in ("!s:~%n%,1!") do if not "%%~a"=="" set /a n+=1& >>output!n!.txt echo %%~a& goto #
 endlocal
exit /b

а для чего, интересно, такое будет использоваться?

greg zakharov 29-11-2017 17:24 2781029

Проще воспользоваться SQLite.
Код:

/* 2>nul
@echo off
  for /f "tokens=1,2,3 delims=|" %%i in ('sqlite3 ^<"%~f0"') do (
    echo:%%i>>output1.txt
    echo:%%j>>output2.txt
    echo:%%k>>output3.txt
  )
exit /b */
CREATE TEMP TABLE t(txt);
.import file.txt t
SELECT SUBSTR(txt, 1, 1), SUBSTR(txt, 2, 1), SUBSTR(txt, 3, 1) FROM t;
DROP TABLE t;


alpap 29-11-2017 17:55 2781039

Цитата:

Цитата greg zakharov
SUBSTR(txt, 3, 1) »

а безлимит как сделать? У меня нет ограничения строки кроме штатной cmd.

greg zakharov 29-11-2017 18:15 2781043

А кто сказал что в cmd строка не имеет ограничение по количеству символов? Там потолок в 8191 символ, раз, во-вторых, если делать разбор все тем же SQLite, можно запилить цикл, бьющий строку на нужное количество столбцов, два, ну и третье. Вопрос был задан как разбить строки, про "безлимит" речи не было. И кстати, вся задача по сути сводится к одной единственной команде в консоли:
Код:

cmd /v/c "(for /f %i in (file.txt) do @set "#=%i"&(for /l %j in (0,1,2) do @set /a n=%j+1&@echo !#:~%j,1!>>output!n!.txt))" >nul
А вообще, по-хорошему, давно пора положить на cmd и использовать более функциональные вещи.

alpap 29-11-2017 20:07 2781070

Цитата:

Цитата greg zakharov
Там потолок в 8191 символ »

это и имелось ввиду под:
Цитата:

Цитата alpap
кроме штатной cmd. »

Цитата:

Цитата greg zakharov
про "безлимит" речи не было. »

на этом форуме и пока - да. Вероятно будет. Не просто так сыр-бор.

Цитата:

Цитата greg zakharov
по-хорошему, давно пора ...»

да кто ж спорит, но вопросы-то тут задают и отвечать надо.

megaloman 29-11-2017 20:42 2781074

Цитата:

Цитата alpap
а для чего, интересно, такое будет использоваться? »

До кучи
Код:

@Echo Off

Set "FileIn=Z:\Box_In\input.txt"
Set "OutFile=Z:\Box_Out\output"
Set "OutFileExt=txt"
Set /A N1=0
Set /A N2=2

FOR /L %%i IN (%N1%,1,%N2%) DO (
        >"%OutFile%%%i.%OutFileExt%" (FOR /F "usebackq delims=" %%s IN ("%FileIn%") DO Call :Column "%%s" %%i)
)
GoTo :Eof

:Column
        Set "@Str=%~1"
        Call Set "@Str=%%@Str:~%2,1%%"
        Echo %@Str%
GoTo :Eof


ruslaw 30-11-2017 22:42 2781345

Цитата:

Цитата alpap
а для чего, интересно, такое будет использоваться? »

Это небольшой фрагмент пакетной обратботки файлов общая цель которой преобразовать базу данных записной книжки RightNote в набор файлов Scrapbook.
RightNote - одна из лучших систем управления информацией (вместе с WjjSoft myBase), но я нашел, что Scrapbook еще лучше и решил преобразовать в нее.
И еще вопрос.
Как сделать так чтобы bat обрабатывал не один файл input.txt, а множество файлов по списку list.txt, напр.
Очень бы помогло.

alpap 01-12-2017 02:59 2781375

Цитата:

Цитата ruslaw
обрабатывал не один файл input.txt, а множество файлов »

без списка, просто выбирая из папки: "C:\papka" все txt (или точнее задать маску при необходимости)
Код:

@echo off
set "d1=C:\papka"
set "d2=C:\out"
if not exist "%d2%" md "%d2%"
for /f "delims=" %%f in ('2^>nul dir /a-d/b "%d1%\*.txt"') do <"%d1%\%%f" (for /f "delims=" %%a in ('more') do @set "s=%%a"& call :# "%d2%" "%%~nf")
pause& exit

:#
 setlocal enabledelayedexpansion
  for %%a in ("!s:~%n%,1!") do if not "%%~a"=="" set /a n+=1& >>"%~1\%~2_out!n!".txt echo %%~a& goto #
 endlocal
exit /b

если сильно надо по списку, то так:
(в файле списка перечислить имена файлов с расширением в столбик по одному в строке)
Код:

@echo off
set "d1=C:\papka"
set "d2=C:\out"
set "f=C:\spisok.txt"
if not exist "%d2%" md "%d2%"
for /f "delims=" %%f in ('2^>nul dir /a-d/b "%d1%\*.txt"^|findstr /g:"%f%"') do <"%d1%\%%f" (for /f "delims=" %%a in ('more') do @set "s=%%a"& call :# "%d2%" "%%~nf")
pause& exit

:#
 setlocal enabledelayedexpansion
  for %%a in ("!s:~%n%,1!") do if not "%%~a"=="" set /a n+=1& >>"%~1\%~2_out!n!".txt echo %%~a& goto #
 endlocal
exit /b


ruslaw 02-12-2017 23:01 2781892

Большое спасибо за помощь!


Время: 11:28.

Время: 11:28.
© OSzone.net 2001-