기 타 여러 텍스트 파일을 하나의 줄로 저장 하고 싶어요
2022.06.04 17:52
폴더내에 여러 텍스트파일을 합치고 싶은데요
텍스트 파일 하나당 한줄로 나오게 할 수 있을까요?
한줄이 텍스트 파일 하나인셈인거죠
그리고 역으로 한줄로 저장된 텍스트 파일을
개별로 따로 저장이 가능한지요?
댓글 [15]
-
VᴇɴᴜꜱGɪʀʟ 2022.06.04 22:46
-
지후빠 2022.06.04 23:50
배치파일로 골격만 잡았습니다. 원본 소스의 인코딩 등을 고려하셔서 필요한 방향으로 수정해보시면 좋겠습니다. ^^;
textjoin.cmd 같은 폴더에 있는 모든 .txt 파일을 파일 하나당 한줄로 정리합니다. 편의상 줄사이 스페이스를 하나 추가하였습니다.
@echo off & cd /d "%~dp0" & setlocal enabledelayedexpansion
for %%# in (*.txt) do (set "line="
for /f "delims=" %%a in (%%~s#) do set "line=!line!%%a "
echo !line! >> textjoin.out
)
endlocal & pause
textsplit.cmd textjoin.out 텍스트 파일을 한줄씩 각 파일로 분리하여 out숫자.txt 로 저장합니다.
@echo off & cd /d "%~dp0" & setlocal enabledelayedexpansion
set "file=textjoin.out"
for /f "delims=" %%a in (%file%) do set /a i+=1 & echo %%a > out!i!.txt
endlocal & pause
-
고북 2022.06.05 07:53
감사합니다.
-
메리아 2022.06.05 11:01
이런건 VBscript가 나을거 같아 VBS로 짜봤습니다.
위의 배치파일에 비해 길고 복잡해보이긴 합니다만
원하는대로 조건 걸고 제어하기는 훨씬 좋죠.(물론 문법을 알아야하지만요...)
지금 첨부하는 파일로는 완벽히 원하는 동작이 나오지는 않겠지만
내용을 잘 뜯어보신다면 어느 부분을 고쳐야할지 보일겁니다.
파워셸이나 배치파일은 좀 복잡한 조건을 거르는게 참 힘들거든요. VBS는 그런 쪽에서 훨씬 유리합니다.
-
고북 2022.06.05 12:47
파일 합칠때 내용을 발췌해서 파일명을 정하는것도 가능하신가요?
날짜 이름vs이름
이렇게요
-
메리아 2022.06.05 14:56
무슨 의미인지 언뜻 이해가 잘 안가는데요
파일 합치기를 원하는데 앞부분 발췌나 날짜를 원한다면
1 txt 내용 합치기 test.vbs 파일에서
objTxtfs.WriteLine(eachFile.Path)
objTxtfs.WriteLine(tmp_ReadAll + vbNewLine)
이 부분을 고쳐야하는데요
각각 파일 FullPath랑 읽은거 한줄로 만들어 쓰기하는 부분인건 아시겠죠?
저기서 [파일명 : 내용] 이런구조를 원한다면, 두 줄을 하나로 합치고 아래와 같이 쓰면 됩니다.
objTxtfs.WriteLine(eachFile.Name & " : " & tmp_ReadAll & vbNewLine)
위에서 [수정날짜 / 파일명 : 내용]을 원한다면
objTxtfs.WriteLine(eachFile.DateLastModified & " / " & eachFile.Name & " : " & tmp_ReadAll & vbNewLine)
위에서 [수정날짜 / 내용앞부분 : 내용] (대충 앞부분 10글자라고 치고)
objTxtfs.WriteLine(eachFile.DateLastModified & " / " & Left(tmp_ReadAll, 10) & " : " & tmp_ReadAll & vbNewLine)
그리고 파일 분리를 원하는데 파일명을 내용 발췌하는걸 원하는건가 싶어서 또 말씀드리자면
2 txt 내용 분리하기 test.vbs 에서
Set objTxtfs_sub = objFSO.OpenTextFile("output_" & idx & ".txt", ForWriting, True)
이 부분을 고쳐야 할텐데요,
Set objTxtfs_sub = objFSO.OpenTextFile(Left(tmp_ReadAll, 10) & ".txt", ForWriting, True)
이런식으로 쓸 수 있습니다.
문제는 "파일명 불가능 문자"가 있습니다.
이거 거르는 명령 써야하는데 일단 좀 찾아보고 올려드릴게요.
-
메리아 2022.06.05 15:26
파일명 불가능 문자 거르는 코드입니다.(Function 부분을 맨뒤든 앞이든 복붙하면 됩니다.)
VBscript로 만들어 놓은게 없어서 다른거 찾아다 고쳐서 손본다고 좀 늦었네요.
뭐, 파일명 불가능 문자 쓰실일 없다면야 필요는 없을겁니다만,
필요하면 쓰셔야할겁니다.
그리고 보다시피 불가능 문자 중에 C:\abc\def.txt 같은 전체경로를 넣으면 안되고
반드시 def.txt같은 파일명만 넣고 상위경로와 합쳐야합니다.(확장자는 가능)
불가능 문자에 :와 \가 있기 때문에요.
new_FileName = win_FileName(Left(tmp_ReadAll, 10) & ".txt", "")
Set objTxtfs_sub = objFSO.OpenTextFile(new_FileName, ForWriting, True)
이런식으로 쓰시면 됩니다.
MsgBox win_FileName("def.txt", "")MsgBox win_FileName("de?*:f.txt", "")MsgBox win_FileName("de?*:f.txt", "_")' Function win_FileName(inFileFolderName, Optional other_char = "") 'As StringFunction win_FileName(inFileFolderName, other_char)'//경로를 넣으면 안됨. 경로 구분자를 위한 처리까지 하게 되어있음.'ex) C:\abc\de?*:f.txt -> 입력하면 경로 깨짐' de?*:f.txt -> de?×:f.txt (아스키가 아닌 유사한 유니코드 문자로 변경)Dim retFileFolderNameretFileFolderName = inFileFolderNameretFileFolderName = Trim(retFileFolderName)If Len(other_char) = 0 ThenretFileFolderName = Replace(retFileFolderName, "?", "?")retFileFolderName = Replace(retFileFolderName, "\", "\")retFileFolderName = Replace(retFileFolderName, "/", "/")retFileFolderName = Replace(retFileFolderName, ":", ":")retFileFolderName = Replace(retFileFolderName, "*", "×")retFileFolderName = Replace(retFileFolderName, """", "¨")retFileFolderName = Replace(retFileFolderName, "<", "〈")retFileFolderName = Replace(retFileFolderName, ">", "〉")retFileFolderName = Replace(retFileFolderName, "|", "|")ElseretFileFolderName = Replace(retFileFolderName, "?", other_char)retFileFolderName = Replace(retFileFolderName, "\", other_char)retFileFolderName = Replace(retFileFolderName, "/", other_char)retFileFolderName = Replace(retFileFolderName, ":", other_char)retFileFolderName = Replace(retFileFolderName, "*", other_char)retFileFolderName = Replace(retFileFolderName, """", other_char)retFileFolderName = Replace(retFileFolderName, "<", other_char)retFileFolderName = Replace(retFileFolderName, ">", other_char)retFileFolderName = Replace(retFileFolderName, "|", other_char)End Ifwin_FileName = retFileFolderNameEnd Function -
고북 2022.06.05 11:43
감사합니다
-
고북 2022.06.05 11:49
지후빠님
파일 첨부했습니다.
-
지후빠 2022.06.05 12:19
txt 파일 형태를 보니 줄 구분자를 넣을 필요 없겠다 싶어서 스페이스 추가 부분 없앴습니다.
한가지 더 추가했습니다. 용도에 따라 수정이 편하신 것을 사용할 수 있겠습니다.^^
@echo on & cd /d "%~dp0" & setlocal enabledelayedexpansion
for %%# in (*.txt) do (set "line="
for /f "eol= delims=" %%a in (%%~s#) do set "line=!line!%%a"
echo !line! >> textjoin.out
)
endlocal & pause
@echo off & cd /d "%~dp0" & setlocal enabledelayedexpansion
for %%# in (*.txt) do (
for /f "eol= delims=" %%h in (%%~s#) do (>>textjoin.out <nul set /p unused=%%h)
echo.>>textjoin.out
)
endlocal & pause
-
고북 2022.06.05 12:24
감사합니다
잘 작동합니다.
-
지후빠 2022.06.05 14:11
원본 파일명 정보도 포함하도록 하였습니다.
@cd /d "%~dp0" & setlocal enabledelayedexpansion
for %%# in (*.txt) do (set "line=%%#|"
for /f "eol= delims=" %%a in (%%~s#) do set "line=!line!%%a"
echo !line! >> textjoin.out
)
endlocal & pause
원본 파일명으로 분리토록하였습니다. 혹시 줄바꿈도 원본처럼 복원해야하나요?
@cd /d "%~dp0" & setlocal enabledelayedexpansion
@set "file=textjoin.out"
for /f "tokens=1* delims=|" %%a in (%file%) do echo %%b >> %%a
endlocal & pause
-
고북 2022.06.05 16:56
그래주시면 감사합니다.
대단하세요~ ^^
-
지후빠 2022.06.05 18:37
합칠때는 "|"로 연결하고 분리할때 "|"를 기준으로 줄을 나눕니다.
파일 이름도 저장하고 복원합니다.
원본 텍스트 파일 줄이 26줄 이상이면 마지막 줄은 분리되지 않고 한줄로 나옵니다. 샘플파일에서는 21줄 이하라 문제 없을듯...
@cd /d "%~dp0" & setlocal enabledelayedexpansion
for %%# in (*.txt) do (set "line=%%#"
for /f "eol= delims=" %%a in (%%~s#) do set "line=!line!|%%a"
echo !line!>> textjoin.out
)
endlocal & pause
@cd /d "%~dp0" & setlocal enabledelayedexpansion
for /f "tokens=1-25* delims=|" %%a in (textjoin.out) do (
call :APPEND "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" "%%g" "%%h" "%%i" "%%j" "%%k" "%%l" "%%m" "%%n" "%%o" "%%p" "%%q" "%%r" "%%s" "%%t" "%%u" "%%v" "%%w" "%%x" "%%y" "%%z")
endlocal & pause & exit /b
:APPEND
set out=%1
:loop
shift
if "%~1"=="" (exit /b) else echo %~1>> %out%
goto loop
-
고북 2022.06.05 19:19
완벽히 구현되었습니다.
꾸벅~~
줄 끌의 줄 바꿈을 한 엔터의 처리에 따라 다르겠죠.
병합하기전에 미리 줄 바꿈을 한 엔터를 없애거나 병합하고 나서 줄 바꿈을 한 엔터를 없애야 겠죠.
대부분의 텍스트 에티터에는 줄바꿈 엔터를 없애는 기능은 문단 부호를 보이게 하고 없애는 기능은 있습니다.
그리고 역으로 한줄로 저장된 텍스트 파일을 개별로 따로 저장은 일일이 수작업을 해야겠죠. 새로운 파일을 만들어야 하니까요!