TXT 파일 특정 값들을 Excel이나 Matlab에서 읽기

choroot의 이미지

전 초보입니다.
제 상황을 좀 더 자세히 설명 드리자면,
Matlab이나 Hspice를 돌리면 (Unix 환경), 아주 지저분한 프로그램 로그 파일 (txt 파일) 중간 중간에

write_time_rise= 1.1234E-12 targ= 2.3333E-12 trig= 3.1234E-12
write_time_fall= 1.1234E-11 targ= 2.1103E-12 trig= 3.0500E-12
write_power= 1.1234E-07 from= 2.1234E-09 to= 2.2222E-09

와 같은 결과 값들 (100개 정도) 이 있고, 이 중 제가 필요한 부분은

write_time_rise= 1.1234E-12
write_time_fall= 1.1234E-11
write_power= 1.1234E-07

들이고 각각의 값들을 읽어서 맘대로 요리 (최대값, 최소값, 평균값 등 구하고 엑셀로 예쁘게 옮겨서 플롯 등) 하고 싶습니다.

이곳 도움을 받아 grep명령어로 원하는 부분을 따로 저장해서 엑셀로 옮길 수 있게 되었습니다.
(감사합니다. 저한테는 엄청난 변화였습니다.)

이곳 글들을 읽고 일반적인 Perl이나 Python 책들을 읽었는데......포기했습니다.
그 엄청난 자료 속에서 내가 원하는 (위에서 언급한) 기능을 찾는다는 것은 초보인 저에게 너무 힘든 일이었습니다.

저에게는 Perl이나 Python으로 빠져들기 위한 '아주 쉽고 간단한' 조언을 부탁드립니다. 예를 들어,

'Perl이나 Python에서 어떤 어떤 기능이나 함수를 공부하시면 됩니다.'
'Per이나 Python으로 TXT 파일에서 특정 값을 읽어서 Excel에서 읽는 쉬운 예제 모음.'

어쩌면 게으른 초보의 건방진 질문일 수 있으나.....조금만 더 도움을 주시면 감사하겠습니다.

Hyun의 이미지

[hyun@hyun host]$ echo 'write_time_rise= 1.1234E-12 targ= 2.3333E-12 trig= 3.1234E-12
write_time_fall= 1.1234E-11 targ= 2.1103E-12 trig= 3.0500E-12
write_power= 1.1234E-07 from= 2.1234E-09 to= 2.2222E-09' | sed 's/\s\?[_a-z]\+= /,/g'
,1.1234E-12,2.3333E-12,3.1234E-12
,1.1234E-11,2.1103E-12,3.0500E-12
,1.1234E-07,2.1234E-09,2.2222E-09
[hyun@hyun host]$ echo 'write_time_rise= 1.1234E-12 targ= 2.3333E-12 trig= 3.1234E-12
write_time_fall= 1.1234E-11 targ= 2.1103E-12 trig= 3.0500E-12
write_power= 1.1234E-07 from= 2.1234E-09 to= 2.2222E-09' | sed 's/\s\?[_a-z]\+= /,/g' > choroot
[hyun@hyun host]$ octave
GNU Octave, version 3.4.3
....
....
....
octave:1> csvread ('choroot') 
ans =
 
   0.0000e+00   1.1234e-12   2.3333e-12   3.1234e-12
   0.0000e+00   1.1234e-11   2.1103e-12   3.0500e-12
   0.0000e+00   1.1234e-07   2.1234e-09   2.2222e-09
 
octave:2> 

위에 해당되는 부분을 choroot 파일로 csv 형식으로 저장하고 octave 에서 csvread 함수로 읽었습니다. 아마 matlab 에서도 csvread 함수가 있거나 동등한 역할을 하는 함수가 있던걸로 기억합니다. 한번 확인해 보세요.

snowall의 이미지

규칙이 어느정도 알려진 문자열 속에서 정해진 패턴에 맞는 것들을 골라내려면 정규표현식(Regular expression, regex)을 공부하세요.

웬만한 프로그래밍 언어에서는 다 지원합니다.

피할 수 있을때 즐겨라! http://melotopia.net/b

isty2e의 이미지

정규 표현식이나 문자열(string) 다루는 쪽을 집중적으로 보시면 되겠네요.

예를 들어 제가 좋아하는 루비로 해 볼까요... 데이터가 저장된 파일이 예를 들어 data.txt라고 합시다.

data.txt:
write_time_rise= 1.1234E-12 targ= 2.3333E-12 trig= 3.1234E-12
write_time_fall= 1.1234E-11 targ= 2.1103E-12 trig= 3.0500E-12
write_power= 1.1234E-07 from= 2.1234E-09 to= 2.2222E-09

파일을 읽어 오려면

data_file=File.open("data.txt")

이러면 data_file이라는 객체에서 data.txt의 내용을 읽을 수 있습니다. 예를 들어

line=data_file.gets

라고 하면 맨 처음 줄을 읽어오고, line 변수의 값이 됩니다. 이 경우는 "write_time_rise= 1.1234E-12 targ= 2.3333E-12 trig= 3.1234E-12\n"이 되겠네요.

그러면서 읽어오는 위치를 한 줄 뒤로 합니다. 즉 다음에 data_file.gets를 하면 그 값은 "write_time_fall= 1.1234E-11 targ= 2.1103E-12 trig= 3.0500E-12\n"가 되겠죠.

일단 파일의 전체 내용을 훑으면서 한 줄씩 처리하는 걸 볼까요.

while line=data_file.gets
    #do_something
end

이런 루프를 통해 파일이 끝날 때까지 한 줄씩 처리를 할 수 있습니다. 물론 한 번에 파일 내용 전체를 긁어 처리하는 방법도 있습니다만 그건 나중에 하고...

이 경우에 가장 쉬운 해결책은 공백으로 쪼개는 겁니다. 즉

write_time_rise= 1.1234E-12 targ= 2.3333E-12 trig= 3.1234E-12

이걸 쪼개면

write_time_rise=
1.1234E-12
targ=
2.3333E-12
trig=
3.1234E-12

이렇게 되는데, 변수명에 공백이 없기 때문에 잘 작동하겠군요. 루비에서 이건 split 메소드를 이용하여 처리할 수 있습니다.

"write_time_rise= 1.1234E-12 targ= 2.3333E-12 trig= 3.1234E-12\n".split
=>["write_time_rise=", "1.1234E-12", "targ=", "2.3333E-12" "trig=" "3.1234E-12"]

그럼 저 Array를 편의상 a라 했을 때, a[0]과 a[1]을 다시 출력해 볼 수 있겠네요.

그 전에 "write_time_rise=" 끝에 붙은 =가 예쁘지 않으니까 a[0] 대신 a[0][0..-2]를 씁시다. a[0]는 "write_time_rise="고, 이걸 [0..-2] 부분만 본다는 건데, [0]은 "w", [1]은 "r"... [-2]는 "e", [-1]은 "="가 됩니다.

a[1]은 실수니까, 변수 값에 string 대신 실수 타입을 쓰도록 합시다. 이건 .to_f 메소드를 이용하면 됩니다.

data_file = File.open ("data.txt")
while line = data_file.gets
    variable_name, variable_value = line.split[0][0..-2], line.split[1].to_f
    puts "#{variable_name}= #{variable_value}"
end

아 근데 더 쓰려니 피곤해지네요... 하여튼 문자열 처리와 정규 표현식을 공부하시면 될 겁니다. csv 파일 포맷은 쉼표만 찍으면 되니까 어렵지 않구요.

choroot의 이미지

감사합니다.

cz201의 이미지

그냥 C언어로 txt 파일을 분석하는 코드를 작성하는 것도 많이 어렵지는 않다고 생각합니다.

댓글 달기

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