탭을 공백 문자로 바꾸기

A씨는 개발된 소스코드를 특정업체에 납품하려고 한다. 개발된 소스코드들은 탭으로 들여쓰기가 된것, 공백으로 들여쓰기가 된 것들이 섞여 있다고 한다. A씨는 탭으로 들여쓰기가 된 모든 소스를 공백 4개로 수정한 후 납품할 예정이다.

A씨를 도와줄 수 있도록 소스코드내에 사용된 탭(Tab) 문자를 공백 4개(4 space)로 바꾸어 주는 프로그램을 작성하시오.

반대로 문제를 공백4개를 탭으로 바꾸라고 했으면 좀더 어려운 문제가 될뻔, 빌트인 함수라고 해도 replace 로 구현하면 알고리즘 문제가 되지 않죠. 실무에서 라면 몰라도, replace를 사용하지 않고 구현하라는 부분이 추가되면 좋겠네요. - 이 종성, 2016/09/15 13:57 M D
이 문제가 쉬운문제이긴 하나 많은 분들이 실수하고 계신것이 있네요. 분명 탭으로들여 쓰기가된 부분만 공백으로 바꾸어야 하는데 소스코드 중간에 들어가있는 탭까지 공백으로 바꾸는 문제풀이들이 많군요 - 윤태호, 2016/11/02 01:55 M D
문제 풀이에 그런 말이 없어서 당연한 것 아닐까요. 게다가 문서 중간에 탭을 쓰는 경우도 거의 없고. - Flair Sizz, 2016/11/06 15:34 M D
문제의 첫 두줄은 예를 들어 상황을 설명한 것이고. 문제는 마지막 줄에 있네요. 소스코드내에 사용된 탭 문자를 공백으로 바꾸라고 되어 있습니다. 들여쓰기 탭문자만 공백으로 바꾸라는 말은 없습니다. - Scott.Jun, 2017/02/19 00:03 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

122개의 풀이가 있습니다. 12 / 13 Page

Haskell

import System.Environment
import Control.Monad


tabToSpace line =
    case line of
        '\t':xs -> "    " ++ (tabToSpace xs)
        otherwise -> line

main = do
    inputFile <- getArgs
    let filename = if inputFile == [] then "example.txt" else inputFile !! 0
    contents <- readFile filename
    let result = unlines $ fmap (tabToSpace) (lines contents)
    writeFile ("New_" ++ filename) result
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def Change_to_space(string):
    return string.replace('\t',' '*4)

#### 2016.12.09 D-440 ####


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

위키독스의 점프 투 파이썬 중

a.txt라는 파일에 있는 탭을 4개의 공백으로 바꾸어 b.txt라는 파일에 저장하고 싶다면 다음과 같이 수행해야 한다.

python tabto4.py a.txt b.txt 1. 우선 다음과 같이 tabto4.py 파일을 작성해 보자.

(※ tabto4.py는 C:\Python 디렉터리에 저장한다.)

# c:/Python/tabto4.py
import sys

src = sys.argv[1]
dst = sys.argv[2]

print(src)
print(dst)

sys.argv를 이용하여 입력값을 확인하도록 만든 코드이다.

  1. 다음과 같이 수행했을 때 입력값들이 정상적으로 출력되는지 확인해 보자.

C:\Python>python tabto4.py a.txt b.txt a.txt b.txt 입력으로 전달한 a.txt와 b.txt가 정상적으로 출력되는 것을 확인할 수 있다.

  1. 테스트를 위한 원본 파일(탭을 포함하는 파일)인 a.txt를 다음과 같이 작성한다. 각 단어들은 탭(\t) 문자로 분리되도록 입력해야 한다.

Life is too short You need python 4. 이제 탭 문자를 포함한 a.txt 파일을 읽어서 탭을 공백 4개로 변환할 수 있도록 코드를 변경해 보자.

# c:/Python/tabto4.py
import sys

src = sys.argv[1]
dst = sys.argv[2]

f = open(src)
tab_content = f.read()
f.close()

space_content = tab_content.replace("\t", " "*4)
print(space_content)

위 코드는 src에 해당되는 입력 파일을 읽어서 그 내용을 tab_content라는 변수에 저장한 후 문자열의 replace 함수를 이용하여 탭(\t)을 4개의 공백으로 변경하는 코드이다.

  1. tabto4.py를 위와 같이 변경한 후 다음과 같은 명령을 수행해 보자.

C:\Python>python tabto4.py a.txt b.txt Life is too short You need python 아마도 탭 문자가 공백 4개로 변경되어 출력될 것이다. 하지만 탭과 공백의 차이점을 눈으로 확인할 수는 없으므로 탭이 정상적으로 공백으로 변경되었는지 확인하기 어렵다.

  1. 이제 변경된 내용을 b.txt 파일에 저장할 수 있도록 다음과 같이 프로그램을 변경해 보자.
# c:/Python/tabto4.py
import sys

src = sys.argv[1]
dst = sys.argv[2]

f = open(src)
tab_content = f.read()
f.close()

space_content = tab_content.replace("\t", " "*4)

f = open(dst, 'w')
f.write(space_content)
f.close()

탭이 공백으로 변경된 space_content를 출력 파일인 dst에 쓰도록 코드를 수정하였다.

  1. 프로그램을 실행하기 위해 다음과 같은 명령을 수행한다.

C:\Python>python tabto4.py a.txt b.txt 위 명령을 수행하면 b.txt 파일이 C:\Python 디렉터리에 생성된다. 에디터로 b.txt 파일을 열어서 탭이 4개의 공백 문자로 변경되었는지 확인해 보자. 프로그램 작성 시 사용하는 에디터는 대부분 탭과 공백 문자를 다르게 표시하므로 눈으로 확인이 가능할 것이다.

저작권은 박응용씨한테 있습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

public class TabTo4Space { public static void main(String[] args) throws IOException{

    FileInputStream originalFis = null;
    FileOutputStream outputFis = null;
    try{
        originalFis = new FileInputStream(new File("D:/temp/String.java"));
        outputFis = new FileOutputStream(new File("D:/temp/StringOutput.java"));
        int readValue = 0;
        while((readValue = originalFis.read())!= -1){
            char character = (char)readValue;
            if(character =='\t'){
                outputFis.write(' ');
                outputFis.write(' ');
                outputFis.write(' ');
                outputFis.write(' ');
            }else{
                outputFis.write(readValue);
            }

        }

    }catch(IOException ioe){

    }finally{
        if(originalFis != null){
            originalFis.close();
        }
        if(outputFis != null){
            originalFis.close();
        }
    }


}

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.


#with 사용시 file open/close 필요 X
# "    "  보다는  " " * 4가 더 가독성이 좋음


with open('output.txt',"wb") as wp:
    with open("input.txt",'rb') as rp:
        for line_no,line in enumerate(rp):
            replaced = line.replace("\t", " " * 4)
            writeline = wp.write(replaced)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 3.x 기준 변환할 파일을 입력하고, 새로 저장할 이름을 입력하여 만들었습니다.

# -*- coding: utf-8 -*- 
# 파일을 읽어서 탭을 공백4개로 치환
name = input('Read file name : ')
new = input('Save file name : ')
f = open(name, 'r')
tab = f.read()
space = tab.replace("\t", " "*4)
f.close()
f = open(new, 'w')
f.write(space)
f.close()
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
var str = "안녕하세요            ㅇㅇ      ㅇㅇ  ㄴㄷ";
str = str.replace(/\t/gi, '    ');
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
from functools import reduce

def space4indent(address):
    text=open(address, "r+")
    ls=text.readlines()
    result=reduce(lambda x,y: x+"".join(map(lambda x: x.replace("\t","    ",1), y)), ls)
    text.close()
    file=open("text.py", "w");file.write(result);file.close()

space4indent("text.py")

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
src=open('file.txt','r')
dst=open('dest.txt','a')

lines = src.readlines()

for line in lines:
    dst.write(line.replace("\t"," "*4))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import codecs
with codecs.open('a.txt', 'r', 'utf8') as read_file:
    with codecs.open('a_.txt', 'w', 'utf8') as write_file:
        for row in read_file:
            write_file.write(row.replace('\t', '    '))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 122
haskell x 1
php x 3
java x 18
scala x 2
python x 53
javascript x 3
perl x 2
lisp x 1
기 타 x 21
cpp x 6
go x 1
cs x 7
objectivec x 2
clojure x 1
ruby x 1