데이터 필터링(?)에 대해 질문드립니다.

koreaccm의 이미지

먼저 이해를 돕고자 아주 간단한 샘플을 파일로 첨부했습니다.

문제는 다음과 같습니다.

엑셀 작업 중,
저는 "y값으로 표시한 데이터만 출력하고 싶은데"
스프레드시트의 필터 기능을 적용하면,
가로든 세로든 옆에 붙어있는 "n"값을 가진 행도 보이더라구요.

몇 시간 동안 고민했는데 실마리조차 찾길 못하겠습니다.
대학 때 교양으로 들은 건 있어서...
유닉스 명령어(grab?)를 사용하면 가능할 것도 같고...

워낙 회사 엑셀파일을 다루면서 자주 겪는 상황이라
꼭 좀 조언을 듣고 싶습니다.

p.s 최근 생전 처음으로 프로그래밍 언어(파이썬)를 공부하면서 이런 생각도 해봤는데 사실 제 능력 밖이라 그냥 상상만 해봤습니다.
"xls 파일을 파이썬의 dictionary 배열방식으로 변환해서
y/n 값을 가진 변수를 쌍으로 묶은 뒤
n값을 가진 변수를 찾아서 지우라는 조건식을 건다면?"

File attachments: 
첨부파일 크기
Office spreadsheet icon sample.xls7 KB
koreaccm의 이미지

http://stackoverflow.com/questions/10530301/how-to-filter-from-csv-file-using-python-script

여기 답변의 소스처럼 하면 될까요?
csv 파일로 저장해서 하면 될 것 같은데
저기 답변 소스는 single row만 가능한 것 같네요

그냥 저기 or 조건으로 row만 추가하면 될런지..후

마잇의 이미지

lg25 y y

이런 행만 찾고 싶으신 건가요?


--
마잇

koreaccm의 이미지

네, 맞습니다. 마잇님.

csv 파일 형식으로 표현하자면 이렇습니다.

[ input ]
편의점, lg25, y, 빌딩, n, 패밀리마트, y
극장, cgv, y, 메가박스, y, 트랜스포머, n

[ output ]
편의점, lg25, y, 패밀리마트, y
극장, cgv, y, 메가박스, y

* 참고로 첫 번째 단어(편의점, 극장)는 타이틀이라 그대로 두기

10만 개 정도를 이렇게 해야해서
파이썬 csv 모듈 튜토리얼을 읽고 있습니다만 여전히 안되네요.
짧은 조언이라도 부탁드립니다.

ymir의 이미지

$ cat in.txt
편의점, lg25, y, 빌딩, n, 패밀리마트, y
극장, cgv, y, 메가박스, y, 트랜스포머, n
$ cat in.txt | while read -r line; do ll=`echo $line | sed -e 's/,/ /g'`; set -a $ll; echo -n $1; shift; until [ -z $1 ] ; do [ "$2" = "y" ] && echo -n ", $1, $2"; shift; shift; done; echo ""; done
편의점, lg25, y, 패밀리마트, y
극장, cgv, y, 메가박스, y

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

마잇의 이미지

csv 형식으로 변환 했을 때, 각 행의 필드(셀)의 갯수는 고정적인가요?

분류, 항목1, y/n, 항목2, y/n, 항목3, y/n

이런 형식이라고 했을 때 항목의 갯수가 변칙적인가요? 아니면 정해진 갯수 인가요?


--
마잇

koreaccm의 이미지

새벽에 답글을 확인하고, 이제서야 감사인사를 드리러 왔는데
감사합니다. 추가 질문도 주셔서..
우선 유닉스 명령어 cat을 이용해서 저렇게 할 수 있다는 사실을 알게 되어 너무 감사드립니다.
저도 윈도에서 cygwin을 설치하고 주신 소스가지고 변형해 봤는데 제가 가진 자료는 제대로 필터링이 안되더라구요.

<추가 질문에 대한 답>을 드리면, 열(세로)의 개수는 10개(5쌍)으로 일정하지만 행(가로)의 개수는 가변적입니다. 좀더 정확하게 샘플을 보여드리면 이렇습니다. (사실, y만 끄집어 낼 생각으로 y 입력값 외 나머지는 빈칸입니다)

분류1, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,
, 항목6, y, 항목7, ,항목8, y, , , , ,
, , , , , , , , , , ,
분류2, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,
, 항목6, y, 항목7, ,항목8, y, 항목9, , 항목10, ,
, , , , , , , , , , ,
분류3, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,
, 항목6, y, 항목7, ,항목8, , 항목9, y, 항목10, y,

여기서 ( , , , , , , , , , , ,) 이 부분은 값이 없어서 엑셀에서는 빈 칸으로 처리되어
"사실상 한 줄 띄우기" 입니다. 빈 칸 개수를 세어보면 총 11개로 (분류, 항목1, 항목2 ... 항목 10)과 같은 겁니다.

여기에 맞는 답까지 주신다면, 정말 문제를 해결할 수는 있겠지만
이미 저에게 새로운 방식을 알려주신 것만으로도 충분히 감사드립니다.
정말 감사합니다. :)

ymir의 이미지

$ cat run.sh
#!/bin/bash
 
INFILE=${1-in.txt}
OIFS=$IFS
IFS=,
 
while read -r line
do
        [[ $line = ,,,,,* ]] && continue
 
        set -a $line
        [ "$1" != "" ] && echo "" && echo -n $1
        shift;
        until [ -z $1 ]
        do
                [ "${2## }" = "y" ] && echo -n ", ${1## }, y"
                shift; shift;
        done
done < $INFILE
 
echo ""
IFS=$OIFS
 
exit 0;
 
$ cat in.txt
분류1, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,
, 항목6, y, 항목7, ,항목8, y, , , , ,
, , , , , , , , , , ,
분류2, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,
, 항목6, y, 항목7, ,항목8, y, 항목9, , 항목10, ,
, , , , , , , , , , ,
분류3, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,
, 항목6, y, 항목7, ,항목8, , 항목9, y, 항목10, y,
$ ./run.sh in.txt
 
분류1, 항목1, y, 항목2, y, 항목5, y, 항목6, y, 항목8, y
분류2, 항목1, y, 항목2, y, 항목5, y, 항목6, y, 항목8, y
분류3, 항목1, y, 항목2, y, 항목5, y, 항목6, y, 항목9, y, 항목10, y

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

마잇의 이미지

저는 참견만 하고 답변은 ymir님이 다 해주시네요. :)


--
마잇

koreaccm의 이미지

저는 마잇님과 ymlr님 두 분이나 도움 주시는 줄도 몰랐네요. (1분이신줄..)
처음 썼던 제 글은 제가 모르는 것과 필요한 것도 제대로 질문하지 못하고 있었는데
마잇님께서 핵심만 다시 질문해 주시고
ymlr님께서 직접 코드를 달아주셔서
여기까지 올 수 있었습니다.

고향으로 가는 기차 안에서 위에 적어주신 코드로 실행한 결과,
1시간 30분만에 성공했습니다.
(에러가 나서 원인도 모르고 안되나 보다 했는데 chmod +x 로 permission denied 에러 해결하였습니다)
shell script의 힘이란 이런 것이란걸 새롭게 느꼈고
앞으로 이 부분도 기초부터 공부해 보고 싶네요.

다시 한 번 진심으로 감사드립니다.(_ _)

ymir의 이미지

패턴 매칭을 잘못 걸었네요..;;;

-    [[ $line = ,,,,,* ]] && continue
+    [[ $line = ", , , , , , "* ]] && continue

참고로, 데이터가 복잡할 때에는 파싱하기 편한 패턴으로 정규화 시키는 것도 좋습니다.

$ cat in.txt | sed -e '/, , , , , , /d' -e '$!N;s/\n,//'
분류1, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,  항목6, y, 항목7, ,항목8, y, , , , ,
분류2, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,  항목6, y, 항목7, ,항목8, y, 항목9, , 항목10, ,
분류3, 항목1, y, 항목2, y, 항목3, , 항목4, , 항목5, y,  항목6, y, 항목7, ,항목8, , 항목9, y, 항목10, y,
$
$ cat run2.sh
#!/bin/bash
 
OIFS=$IFS;
IFS=,
 
while read -r line
do
        set -a $line
        echo -n $1
        shift
        until [ -z $1 ]
        do
                [ "${2## }" = "y" ] && echo -n ", ${1## }, y";
                shift; shift;
        done
        echo ""
done
 
IFS=$OIFS
 
exit 0;
 
$ cat in.txt | sed -e '/, , , , , /d' -e '$!N;s/\n,//' | ./run2.sh
분류1, 항목1, y, 항목2, y, 항목5, y, 항목6, y, 항목8, y
분류2, 항목1, y, 항목2, y, 항목5, y, 항목6, y, 항목8, y
분류3, 항목1, y, 항목2, y, 항목5, y, 항목6, y, 항목9, y, 항목10, y

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.