'2011/02'에 해당되는 글 3건

  1. 2011.02.07 [bash] cat 구문에 대한 부분 추출 및 분석 방법
  2. 2011.02.07 [ruby] cat 구문에 대한 대처 / cat의 tab구문을 이용하는 방법 1
  3. 2011.02.07 [ruby] httpConnection use to read xml / 외부 XML 정보 읽어오기 2


앞서 Ruby에 대해서 살펴 보았는데 이번에는 bash 환경입니다.
여기에서는 tab으로 구분된 구분자중에서 2번과 4번 항목을 읽어들여 내부적으로 산술 연산을
하는 부분입니다.

shell 의 목적은 파일사이즈를 모두 합쳐주는것 입니다.

#!/bin/bash


docidG= ""
filesizeG= 0
for docinfo in `cat docsize.txt | awk '{print $2"|"$4}'`
do
        #echo $docinfo
        docid=`echo $docinfo | awk -F"|" '{print $1}'`
        filesize=`echo $docinfo | awk -F"|" '{print $2}'`

         if [ "$docid" == "$docidG" ]; then
            #filesizeG= $filesizeG + $filesize
            let "filesizeG = $filesizeG + $filesize"    >> 산술연산
        else
            echo "$docidG : $filesizeG"
            docidG=$docid
            filesizeG=$filesize
        fi

done


보다 자세한 가이드는
아래를 확인하시면 되겠습니다. ^^
http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/





외부에 있는 txt파일을 ruby에서 읽어들이면
간혹 분명 1줄인데 줄바꿈으로 읽어들이는 경우가 있습니다.
이경우 숨어있는 \t 문자열이 포함 되었기 때문인데 이것을 ruby 에서 split 구문을 이용하면
분석하는데 용이하답니다.

 for docinfo in `cat doc.txt`
                #"#{docinfo}".strip.each('\t\r'){ |info|
                info = "#{docinfo}".split("\t")
                hdb = info[0]
                docid = info[1]
                docno = info[2]
                docurl = info[3]
 

   docsize = callxml(docurl)
     puts "#{hdb}    #{docid}   #{docno}   #{docsize}  #{docurl}"
end











 

 for docinfo in `cat doc.txt`
                #"#{docinfo}".strip.each('\t\r'){ |info|
                info = "#{docinfo}".split("\t")
                hdb = info[0]
                docid = info[1]
                docno = info[2]
                docurl = info[3]

    docsize = callxml(docurl)
     puts "#{hdb}    #{docid}   #{docno}   #{docsize}  #{docurl}"
end


● Target XML

<?xml version="1.0" encoding="UTF-8"?>
<result>
 <header>
  <response_code>201</response_code>
 </header>
 <item>
  <fileinfo>
   <property name="realname"><![CDATA[달려라네오.doc]]></property>
   <property name="filesize"><![CDATA[45241]]></property>
   <property name="mimetype"><![CDATA[application/pdf]]></property>
   <property name="width"><![CDATA[0]]></property>
   <property name="height"><![CDATA[0]]></property>
  </fileinfo>
 </item>
</result>




● RubySource

require "net/http"
require "rexml/document"

...
.....
........
        def callxml(docurl)
            if docurl == nil
                return 0
            end

            pdfsize = 0

            begin
            xml_req = Net::HTTP.get_response(URI.parse("#{docurl}")).body
            #puts "#{xml_req}"   << XML의 모든 내용을 출력합니다.

            doc = REXML::Document.new(xml_req)
            doc.elements.each('result/item/fileinfo/property') do |ele|
                #propertys << ele.elements['property']
                #puts ">>> #{ele.elements.text}"
                #puts ">>> #{ele.elements.attributes.values}"

                #puts ">>> #{ele.name}"
                #puts ">>> #{ele.attributes}"
                #puts ">>> #{ele.attributes.values}"
                #puts ">>> #{ele.elements['property'].text}"
                #puts ">>> #{ele.elements['property'].attributes.value}"
                #puts ">>> #{ele.elements['filesize'].text}"

                if "#{ele.attributes.values}" == "filesize"
                    pdfsize = ele.text
                end
            end

........


#으로 처리된곳은 주석입니다.   
   XML 을 분석하는 과정에서 값이 무엇이 찍히는지 보기 위해 디버깅한 코드로 보시면 되겠네요.
원하는것은 fileSize  찾는것인데 우휴.. 생각보다 시간이좀 걸렸답니다.

아차! HTTP와 REXML 을 사용하기 위해서는  import 해야하는 자원도 잊어서는 안되죠!!
require "net/http"
require "rexml/document"
2줄을 최상위에 선언 해야 되겠습니다. 그리고 class도 만들어서 사용 해야 되요.. ^^




1 

글 보관함

카운터

Total : / Today : / Yesterday :
get rsstistory!