<Perl> 빈칸 있는 열 대체하기.

pepsi의 이미지

20090131LKL20000202305, 20090131, LKL2000020, 2305, 100.36, 363, 6.73
20090131LKL20000202310, 20090131, LKL2000020, 2310, 101.61, 389, 7.28
20090131LKL20000202315, 20090131, LKL2000020, 2315, 101.83, 341, 6.59
20090131LKL20000202320, 20090131, LKL2000020, 2320, 101.10, 316, 6.06
20090131LKL20000202325, 20090131, LKL2000020, 2325, 100.85, 342, 6.34
20090131LKL20000202330, 20090131, LKL2000020, 2330, 101.65, 333, 6.28
20090131LKL20000202335, 20090131, LKL2000020, 2335, 99.43, 360, 6.41
20090131LKL20000202340, 20090131, LKL2000020, 2340, 102.22, 338, 6.15
20090131LKL20000202345, 20090131, LKL2000020, 2345, 104.52, 314, 6.06
20090131LKL20000202350, 20090131, LKL2000020, 2350, 102.43, 344, 6.37
20090131LKL20000202355, 20090131, LKL2000020, 2355, 103.50, 310, 5.74
20090131LKL20000300000, 20090131, LKL2000030, 0000, 83.00, ,
20090131LKL20000300005, 20090131, LKL2000030, 0005, 82.00, ,
20090131LKL20000300010, 20090131, LKL2000030, 0010, 84.00, ,
20090131LKL20000300015, 20090131, LKL2000030, 0015, 81.00, ,
20090131LKL20000300020, 20090131, LKL2000030, 0020, 84.00, ,
20090131LKL20000300025, 20090131, LKL2000030, 0025, 86.00, ,
20090131LKL20000300030, 20090131, LKL2000030, 0030, 92.00, ,
20090131LKL20000300035, 20090131, LKL2000030, 0035, 89.00, ,
20090131LKL20000300040, 20090131, LKL2000030, 0040, 85.00, ,
20090131LKL20000300045, 20090131, LKL2000030, 0045, 78.00, ,
20090131LKL20000300050, 20090131, LKL2000030, 0050, 87.00, ,
20090131LKL20000300055, 20090131, LKL2000030, 0055, 91.00, ,

다음과 같은 데이터가 있는 200901.txt 파일이 있습니다. 여기에 6,7번째 열에 보면 값이 없는 구간이 있습니다.
이 빈 구간을 찾아서 Nan이라는 문자로 대체하려고 합니다. Perl로 하려고 하는데...어떻게 하면 될까요? ㅜㅜ

파일이 200901.txt 부터 201312.txt 까지 있습니다. 자동으로 함꺼번에 처리하고 싶습니다.

raymundo의 이미지

1) 쉼표와 쉼표 사이, 또는 쉼표와 라인의 끝 사이에
2) 아무 것도 없거나, 스페이스(들)만 있거나

하는 경우에 그 자리에 " Nan" 을 적어주고 파일을 덮어쓰는 코드입니다.

% perl -pi -e 's/(?<=,) *(?=,|$)/ Nan/mg' *.txt

간단히 테스트를 하긴 했지만, 그래도 모르니 백업을 해두거나 아니면 파일 몇 개만 다른 곳에 복사해서 테스트해본 다음에 쓰세요 :-)

좋은 하루 되세요!

pepsi의 이미지

감사합니다. 저렇게 간단할 줄이야..^^
만약에 폴더에 200901.txt, 200902.txt....2012.12.txt 까지 있다면 전체 파일에 대해서 위의 명령을 실행해보고 싶습니다. 한번에 실행하려면..어떻게 하면될까요?
번거로우시겠지만..간단한 주석도 해주시면..너무 감사합니다 :)

raymundo의 이미지

위에 적힌 저대로 하시면 현재 폴더의 모든 .txt 파일에 대해 적용됩니다.

perl 인터프리터를 실행할 때 사용한 -p, -i, -e 옵션에 대해서는
http://gypark.pe.kr/wiki/Perl/%EB%94%94%EB%B2%84%EA%B9%85#H_5

나머지는 정규식 치환인데 눈에 보이는 그대로입니다.

s/       # 다음에 매치되는 것을 찾음
(?<=,)     # 쉼표가 바로 직전에 있고
 *         # 공백이 0개 또는 그 이상 있고
(?=,|$)    # 그 뒤에 쉼표 또는 문장의 끝이 오는 경우
/
 Nan     # 그 공백 부분을 " Nan"으로 치환
/mg

좋은 하루 되세요!

pepsi의 이미지

자세한 답변 감사합니다. 한가지만 더 질문해도 될까요?

if ($Ln[1] == LKL2000150) { #LKL2000150
$linkid = 1;
}
elsif ($Ln[1] == LKL2000160) {
$linkid = 2;
}
elsif ($Ln[1] == LKL2000120) {
$linkid = 3;
}
elsif ($Ln[1] == LKL2000050) {
$linkid = 4;
}
elsif ($Ln[1] == LKL2000060) {
$linkid = 5;
}
.
.
.
$line= "$Ln[0]$Ln[1]$Ln[2] $Ln[0] $linkid $Ln[2] $Ln[4] $Ln[3] $Ln[5]";
open OutFile, ">>", $outfile or die $! ;
print OutFile "$line\n";
close OutFile;

위와 같은 조건 문을 써서 위의 세번째 링크 아이디 값을 숫자로 변경하려고 합니다.
그런데 각 링크에 맞는 값이 아닌 모든 링크에 1의 값만 들어네요. 에러는 발생안하는데..
왜그런지 모르겠습니다.

raymundo의 이미지

if elsif else 구조가 제대로 쓰였다면,
무조건 특정 구문( $linkid = 1;이겠죠? )이 실행되었다는 말은
항상 그 if조건이 참이 되었다는 말이죠.

$Ln[1]에 정말 자기가 예상한 필드가 들어있는지 출력은 시켜 보셨나요?

좋은 하루 되세요!