<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]에 정말 자기가 예상한 필드가 들어있는지 출력은 시켜 보셨나요?

좋은 하루 되세요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.