[완료]csv 포맷 cell끼리 계산하는 방법

joa의 이미지

실험 데이터가 csv 포맷(tab delimiter)으로 나옵니다.

이 파일들은 모두 행과 열이 모두 같습니다.

예를 들어, A.csv는

1   2   3
4   5   6

B.csv는
2   3   4
5   6   7

같은 위치의 셀끼리 간단히 사칙연산을 할 필요가 있는데요. 간단히 할 수 있는 방법 없을까요?

엑셀에서 하면 매우 간단하나 행렬수가 많다보니 읽고 쓰는데 시간이 오래걸리고 일일이 수작업으로 반복 작업을 하다보니 좀 짜증이 나네요.

엑셀 매크로를 사용할 수도 있으나 제가 지금 맥을 쓰는 관계로 베이직 매크로가 지원이 안됩니다. --;

아무래도 리눅스(맥, 유닉스)에서 쉽고 빠르게 할 수 있는 방법이 있을 것 같아서 질문 드립니다.

이렇게 이렇게 하면 된다고 하지 마시고 간단한 예제도 같이 적어주시면 정말 큰 도움이 되겠습니다.

그럼 고맙다는 말씀 미리 드립니다.

Hyun의 이미지

오픈 오피스에서 csv 형식의 파일 안에 수식을 넣어 사칙연산을 사용했었습니다.
csv 파일의 데이터 자리에 =sum(...) 뭐 이런 식으로 넣어주니깐 파일을 오픈오피스에서 읽었을 때 잘 동작했습니다.


나도 세벌식을 씁니다

나도 세벌식을 씁니다
불편한웹의 이미지

파일 이름: data

1 2 3
4 5 6
7 8 9

루비 소스 파일 이름: test.rb

#!/usr/bin/ruby
# ruby 1.9.1 에서 테스트 했음
require 'csv'
 
if ARGV.length != 1
    puts "CSV file is required."
    exit
end
 
@sum = [0,0,0]
 
# col_sep 는 column separator
# 콤마로 바꾸기 위해서는 col_sep:","
csv = CSV.open(ARGV[0], "r", col_sep:" ")
csv.each do |row|
    @sum[0] += row[0].to_i
    @sum[1] += row[1].to_i
    @sum[2] += row[2].to_i
end
 
p @sum

결과

$ ruby test.rb data
[12, 15, 18]
amorette의 이미지

근데 이건 행렬의 각 셀이 아니라
파일의 각 라인을 더하는 거네요.

불편한웹의 이미지

제가 문제를 잘못 이해하여 만들었습니다.
그래서 아래에 신버전 출시했습니다.

ymir의 이미지

이런걸 원하시는건지..?

#!/bin/sh
 
if [ $# -ne 4 ] ; then
        echo Error : invalid args..
        exit 1
fi
 
FF=$1   # left operand file
OP=$2   # operator
FT=$3   # right operand file
NF=$4   # number of field
 
if [ ! -f $FF -o ! -f $FT ] ; then
        echo file not found..
        exit 1
fi
 
exec 3<$FF
exec 4<$FT
 
declare -a line1
declare -a line2
 
while true ; do
        out=0
        read -a <&3 line1
        [ $? -ne 0 ] && let "out++"
        read -a <&4 line2
        [ $? -ne 0 ] && let "out++"
 
        [ $out -eq 2 ] && break
 
        for ((i=0; i<NF; i++)) ; do
                if [ -z "$line1" ] ; then
                        R=${line2[$i]}
                elif [ -z "$line2" ] ; then
                        R=${line1[$i]}
                else
                        R=`echo "${line1[$i]} $OP ${line2[i]}" | bc`
                fi
                echo -ne "$R\t"
        done
        echo ""
done
 
3<&-
4<&-
 
exit 0;

$ cat a
1       2       3
4       5       6
7       8       9
10      11      12
$ cat b
7       8       9
10      11      12
13      14      15
 
$ ./run.sh a + b 3
8       10      12
14      16      18
20      22      24
10      11      12
 
$ ./run.sh a \* b 3
7       16      27
40      55      72
91      112     135
10      11      12

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

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

불편한웹의 이미지

공부할 겸 만들어봤습니다. 신버전입니다.

#!/usr/bin/ruby
# ruby 1.9.1 에서 테스트 했음
 
if (ARGV.length != 3) or
    ((ARGV[1] != '+') and (ARGV[1] != '-') and
    (ARGV[1] != '*') and (ARGV[1] != '/'))
    puts "Usage: $ ruby csv1 op csv2"
    puts "$ ruby csv1 + csv2"
    puts "$ ruby csv1 - csv2"
    puts "$ ruby csv1 \\* csv2"
    puts "$ ruby csv1 / csv2"
    exit
end
 
f1 = File.open(ARGV[0])
op = ARGV[1]
f2 = File.open(ARGV[2])
 
while(row1 = f1.gets and row2 = f2.gets)
    row1 = row1.split
    row2 = row2.split
    @sum = [0,0,0]
# %Q[....] 안에 있는 요거 ===> #{op} row2[0].to_i 주석문 아닙니다.
    cmd = %Q[
        @sum[0] = row1[0].to_f #{op} row2[0].to_i
        @sum[1] = row1[1].to_f #{op} row2[1].to_i
        @sum[2] = row1[2].to_f #{op} row2[2].to_i
    ]
    eval(cmd)
    puts "#{@sum[0]} #{@sum[1]} #{@sum[2]}"
end

결과
$ cat data1 data2
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
$ ruby test.rb data1 + data2
11.0 13.0 15.0
17.0 19.0 21.0
23.0 25.0 27.0
$ ruby test.rb data1 - data2
-9.0 -9.0 -9.0
-9.0 -9.0 -9.0
-9.0 -9.0 -9.0
$ ruby test.rb data1 \* data2
10.0 22.0 36.0
52.0 70.0 90.0
112.0 136.0 162.0
$ ruby test.rb data1 / data2
0.1 0.181818181818182 0.25
0.307692307692308 0.357142857142857 0.4
0.4375 0.470588235294118 0.5
aero의 이미지

$ paste A.csv B.csv | perl -alpe '$_="@{[map$F[$_]+$F[$_+@F/2],0..$#F/2]}"'
3 5 7
9 11 13

$ paste A.csv B.csv | perl -alpe '$_="@{[map$F[$_]*$F[$_+@F/2],0..$#F/2]}"'
2 6 12
20 30 42

Perl verbose 버젼은 다른분이 해주시리라 믿음~ :)

joa의 이미지

만약에 같은 형식의 파일이 3개 또는 4개가 된다면 어느 부분을 고쳐야 할까요??
제가 해야 하는 것 중에는 실제 엑셀에서 하듯이 수식을 써서 계산하는 것들도 있거든요.
예를 들어,
A.csv / (A.csv/2 + B.csv/4 + C.csv/8)
같은 수식 계산이요.

그래도 이것만해도 정말 큰 도움이 되었습니다. 감사합니다.
-------------------------------------
귤이 좋아요..
귤 짝퉁 오렌지는 싫어요..

귤을 주세요..

귤이 좋아요..
귤 짝퉁 오렌지는 싫어요..

귤을 주세요..

aero의 이미지

다단계의 복잡한 행렬연산을하시려면 아래 처럼 직접 프로그래밍 하셔야 합니다.
하지만 프로그래밍이 힘드시면 Octave( http://www.gnu.org/software/octave/ ) 같은
프로그램을 사용하시면 편합니다.

$ octave
GNU Octave, version 3.0.1
Copyright (C) 2008 John W. Eaton and others.
 
octave:1> a = load A.csv
a =
 
   1   2   3
   4   5   6
 
octave:2> b = load B.csv
b =
 
   2   3   4
   5   6   7
 
octave:3> c = load C.csv
c =
 
   3   4   5
   6   7   8
 
octave:4> out = a ./ ( a/2 + b/4 + c/8 )
out =
 
   0.72727   0.88889   0.96000
   1.00000   1.02564   1.04348
 
octave:5> save out.csv out
octave:6> quit
 
$ cat out.csv
# Created by Octave 3.0.1, Thu Jan 28 10:52:20 2010 KST <aero>
# name: out
# type: matrix
# rows: 2
# columns: 3
 0.7272727272727273 0.8888888888888888 0.96
 1 1.025641025641026 1.043478260869565
$

위에서 주의하셔야 할 것은 행렬의 나눗셈 연산은 정의되지 않으며 대신 역행렬을 곱하는 식으로 이루어지기 때문에
단순하게 같은 차원을 가진 행렬의 cell끼리 나누려면 ./ 연산자를 써야함을 유의

joa의 이미지

약 1주일간을 고민하던 것이었는데 정말 고맙습니다.

위에서 소개해주신 패키지를 사용하니 정말 빨리 끝나는군요. 몇 초 걸리지 않았습니다.

점점 데이터 다룰 일이 많아지는데 이런 프로그램 하나 정도는 제대로 다루어야 할 것 같네요.

------
귤이 좋아요..
귤 짝퉁 오렌지는 싫어요..

귤을 주세요..

귤이 좋아요..
귤 짝퉁 오렌지는 싫어요..

귤을 주세요..

jg의 이미지

하.. 이게 제가 아래 짠 코드보다 빠르네요. 물론 제 것은 함수 호출이 많긴하지만..
역시 내부처리를 이용하는 것이 빠를까요? ^^
paste 명령어가 느린 편이니 perl로 대체하면 조금 더 빠르겠네요.

#!/usr/bin/env perl
push @ARGV, shift @ARGV;
$opchar = shift @ARGV;
$"="\t";
open($_, '<', $ARGV[$i++]) or die $! for qw(RIGHT LEFT);
open STDOUT, '| perl -alpe \'$_="@{[map$F[$_]'.$opchar.'$F[$_+@F/2],0..$#F/2]}"\'';
 
while (<LEFT>) {
    chomp;
    $_ .= "\t".<RIGHT>;
    print;
}

$ time perl pipe_method.pl A.csv + B.csv > /dev/null
 
real	0m52.240s
user	0m0.563s
sys	0m0.403s
$ time paste A.csv B.csv | perl -alpe '$_="@{[map$F[$_]+$F[$_+@F/2],0..$#F/2]}"' > /dev/null
 
real	0m52.403s
user	0m51.393s
sys	0m0.727s

논외로 파이프 처리를 쉘에게 맡기면 조금 더 빠른 듯??

$ time perl paste.pl A.csv B.csv | perl -alpe '$_="@{[map$F[$_]+$F[$_+@F/2],0..$#F/2]}"' > /dev/null
 
real	0m51.548s
user	0m50.653s
sys	0m0.720s

LOL :-D

--
perl -e's@@JEON Myoung-jin@;sub man{s| _|her e|}
sub see{s;^;Just;;u;s;e ;Perl ;;to;print$_,$/}$uperMan=M;
s=^....=U are not=;s~$uperMan~~;&admitIt;s=U are = A=;s|young|_|;&man;
sub admitIt{say;ye;s!-\w+! Hacker!};see U'

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

amorette의 이미지

use Math::Matrix;
 
my ($file1, $op, $file2) = @ARGV;
 
open my $fh1, '<', $file1 or die;
open my $fh2, '<', $file2 or die;
 
my $m1 = new Math::Matrix( map {[ split "\t" ]} <$fh1> );
my $m2 = new Math::Matrix( map {[ split "\t" ]} <$fh2> );
 
print eval("\$m1 $op \$m2");

이렇게 사용함다.

$ perl csv.pl   A.csv + B.csv
$ perl csv.pl   A.csv - B.csv
$ perl csv.pl   A.csv * B.csv
$ perl csv.pl   A.csv / B.csv
amorette의 이미지

입맛데로 eval 부분을 다른 것으로 치환하면 속도는 더욱 향상.

use List::MoreUtils qw(pairwise);
 
my ($file1, $op, $file2) = @ARGV;
 
open my $fh1, '<', $file1 or die;
open my $fh2, '<', $file2 or die;
 
while (($l1=<$fh1>) && ($l2=<$fh2>)) {
 
    my @l1 = split("\t", $l1);
    my @l2 = split("\t", $l2);
 
    print
        join "\t",
        (pairwise { eval"\$a $op \$b" } @l1, @l2),
        "\n";
}

이렇게 사용함다.

$ perl csv.pl   A.csv + B.csv
$ perl csv.pl   A.csv - B.csv
$ perl csv.pl   A.csv * B.csv
$ perl csv.pl   A.csv / B.csv

amorette의 이미지

을 해보았습니다.
rakudo에 현재 구현된 부분만 사용했기 땜에 작동합니다.

#!perl6
 
my $fh1 = open 'A.csv';
my $fh2 = open 'B.csv';
 
for $fh1.lines Z $fh2.lines -> $l1, $l2 {
 
    say ~( $l1.split("\t") >>+<< $l2.split("\t") );
 
}
neocoin의 이미지

1.8 입니다.

require 'csv'
a,b = [ARGV[0],ARGV[2]].map do |f|                                                       
  CSV.open(f,'r','   ').to_a.map{|i| i.map{|j| j.to_i}}
end
 
mix = a.zip(b).map{|i,j|i.zip j}
r =  mix.map{|i| i.map{|j| j.inject{|m,n| eval "m #{ARGV[1]} n"}}}
puts r.map{|i| i.join "   "}.join("\n")
 

사용법

$ruby run.rb a.csv + b.csv
$ruby run.rb a.csv - b.csv
$ruby run.rb a.csv / b.csv
$ruby run.rb a.csv "*" b.csv

Matrix 패키지로 날로 먹으려 했는데, * / 연산이 행열 연산이라 조건을 만족 못하네요. 그런면에서 perl 패키지 Matrix 연산이 좀 특이한데요.
*는 저렇게 넘겨야 계산되네요.

neocoin의 이미지

b = open ARGV[2]
open(ARGV[0]).map do |i|
  r1 = eval "[#{i.gsub('   ',',')}]"
  r2 = eval "[#{b.readline.gsub('   ',',')}]"
  puts r1.zip(r2).map{|m,n| eval "m #{ARGV[1]} n" }.join('   ')
end
불편한웹의 이미지

이 스레드 만든 분 대박 터졌네요.ㅋㅋ

ymir의 이미지

perl 와 ruby 의 접전(?) 이로군요..ㅎ~

$ cat a
1       2       3
4       5       6
7       8       9
$ cat b
7       8       9
10      11      12
13      14      15
 
$ paste a b | awk ' function add(a,b){return a+b} {split($0,x); for(i=1; i<=NF/2; i++) printf "%f\t",add(x[i],x[i+NF/2]); print '\n';}'
8.000000        10.000000       12.000000
14.000000       16.000000       18.000000
20.000000       22.000000       24.000000

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

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

lateau의 이미지

혜성처럼 등장한 awk :)

--
I think to myself...what a emerging world.

joa의 이미지

이틀만에 들어와보고 정말 놀랐습니다.

댓글 달아주신 분들께 정말 감사드립니다. 윗분 말씀처럼 대박 터졌네요. ^^;

아, 역시 KLDP!

------
귤이 좋아요..
귤 짝퉁 오렌지는 싫어요..

귤을 주세요..

귤이 좋아요..
귤 짝퉁 오렌지는 싫어요..

귤을 주세요..

불편한웹의 이미지

초보자라 공부할 겸 만들어봤습니다.

#!/usr/bin/ruby
# ruby 1.9.1 에서 테스트 했음
 
# 할일 (TO DO)
# 우선 순위, 사칙 연산 파서
# for 문을 사용하여 column 을 현행 3에서 n 으로 확장할 것.
# 예외처리.
 
# SSV : Space Separated Value
class SSV
    def initialize(file)
        @f = File.open(file)
    end
 
    # op 연산자, operand 피연산자
    def compute(op, operand)
        # if 를 수식자(modifier)로 사용하면 코드가 더 간결해질 수 있지만
        # 생각하기 귀찮아서 Copy & Paste 신공으로 처리
        if operand.class == SSV
            while(row1 = @f.gets and row2 = operand.gets)
                row1 = row1.split
                row2 = row2.split
                @sum = [0,0,0]
 
                cmd = %Q[
                    @sum[0] = row1[0].to_f #{op} row2[0].to_i
                    @sum[1] = row1[1].to_f #{op} row2[1].to_i
                    @sum[2] = row1[2].to_f #{op} row2[2].to_i
                ]
                eval(cmd)
                puts "#{@sum[0]} #{@sum[1]} #{@sum[2]}"
            end # end of while
        else
            while(row1 = @f.gets)
                row1 = row1.split
                @sum = [0,0,0]
 
                cmd = %Q[
                    @sum[0] = row1[0].to_f #{op} operand.to_f
                    @sum[1] = row1[1].to_f #{op} operand.to_f
                    @sum[2] = row1[2].to_f #{op} operand.to_f
                ]
                eval(cmd)
                puts "#{@sum[0]} #{@sum[1]} #{@sum[2]}"
            end # end of while
        end # end of if
    end # end of compute
 
    def gets
        @f.gets
    end
end
 
if __FILE__ == $0
    if (ARGV.length != 3) or
        ((ARGV[1] != '+') and (ARGV[1] != '-') and
        (ARGV[1] != '*') and (ARGV[1] != '/'))
        puts "Usage: $ ruby csv1 op csv2"
        puts "$ ruby csv1 + csv2"
        puts "$ ruby csv1 - csv2"
        puts "$ ruby csv1 \\* csv2"
        puts "$ ruby csv1 / csv2"
        puts "$ ruby csv1 + 88"
        puts "$ ruby csv1 - 12.1"
        puts "$ ruby csv1 \\* 5"
        puts "$ ruby csv1 / 9.1"
        exit
    end
 
    ssv1 = SSV.new(ARGV[0])
    op = ARGV[1]
 
    # 내공이 부족한 관계로
    # 파일 이름이 숫자로 시작하면 안 됨.
    # 숫자 뒤에는 영문자 등이 오면 안 됨.
    if ARGV[2] =~ /^[0-9]/
        ssv1.compute(op, ARGV[2])
    else
        ssv2 = SSV.new(ARGV[2])
        ssv1.compute(op, ssv2)
    end
end
lateau의 이미지

Ruby 지저분한 버젼...

csv1, csv2 = [open(ARGV[0]).read.split(/\n/), open(ARGV[2]).read.split(/\s/)]
csv1.join(" ").split(/\s/).each_with_index do |c, i|
  print eval("#{c} #{ARGV[1]} #{csv2[i]}"),
    (csv2.size / csv1.size - 1) == i ? "\n" : "\t"
end

--
I think to myself...what a emerging world.

tsangel의 이미지

import sys
for l1, l2 in zip(file(sys.argv[1]), file(sys.argv[2])):
    print '\t'.join([str((int(v1)+int(v2))) for v1,v2 in zip(l1.split(), l2.split())])

# python26 sum.py a.txt b.txt
3       5       7
9       11      13

-----------
열심히 살자

열심히 살자

tsangel의 이미지

import sys
for la, lb, lc in zip(file(sys.argv[1]), file(sys.argv[2]), file(sys.argv[3])):
    print '\t'.join([str( a/(a/2+b/4+c/8) )
                     for a,b,c in zip(map(float, la.split()),
                                      map(float, lb.split()),
                                      map(float, lc.split()))])

# cat a.txt
1   2   3
4   5   6
# cat b.txt
2   3   4
5   6   7
# cat c.txt
5   6   7
8   9   8
# python26 sum2.py a.txt b.txt c.txt
0.615384615385  0.8     0.888888888889
0.941176470588  0.975609756098  1.04347826087

----------
열심히 살자

열심히 살자

doodoo의 이미지

그면....joa 님은 어느 언어의 어느버젼을 썼을까? 심히 궁금해지는.....

lateau의 이미지

전 또 하나의 조리퐁이 탄생하기를 조금 기대했는데 안타깝네요. [완료]라니 :)

--
I think to myself...what a emerging world.

ymir의 이미지

이미 octave 에 평정되었거든요... =)

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

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

jg의 이미지

aero*님의 코드에 힌트를 얻어 작성한 것입니다.

#!/usr/bin/env perl
push @ARGV, shift @ARGV;
$opchar = shift @ARGV;
eval "sub op { \$_[0] $opchar \$_[1] }";
 
open($_, '<', $ARGV[$i++]) or die $! for qw(RIGHT LEFT);
$"="\t";
while ( $_ = <LEFT>.<RIGHT> ) {
    @num = split;
    $col = $#num * 0.5;
    print "@{[map{ op(@num[$_,$_+$col]) } 0..$col++]}\n";
}

eval을 한 번만 수행하게 한 게 포인트 _-_

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

댓글 달기

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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 사용할 수 있는 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.