csv xml 변환

세벌의 이미지

csv 파일을 xml 파일로 변환하는 프로그램 찾고 있습니다.
utf-8 사용가능하며
무료 또는 공개 소프트웨어
위 조건만 만족하면 되겠는데...
인터넷에서 csv2xml 찾아서

날짜,이름,구분,제조사,모델,과,팀
20100429,세벌,PC,삼성,DM-C200-PP12G,총무과,전산팀

이런 형식의 CSV 파일을 변환시켜 봤더니
<row>
  <____________>20100429</____________>
  <______>세벌</______>
  <______>PC</______>
  <_________>삼성</_________>
  <______>DM-C200-PP12G</______>
  <______>총무과</______>
  <______>전산팀</______>
</row>

위와 같은 식의 결과가 나오네요.
밑줄 대신
<row>
  <날짜>20100429</날짜>
  <이름>세벌</이름>
  <구분>PC</구분>
  <제조사>삼성</제조사>
  <모델>DM-C200-PP12G</모델>
  <과>총무과</과>
  <팀>전산팀</팀>
</row>

이런 정도 결과가 나오는 프로그램 어떤 게 있는지 알려주셔요.
aero의 이미지

csv2xml.pl

#!/usr/bin/env perl
use strict;
use warnings;
 
my @elem;
while ( my $line = <> ) {
    chomp $line;
    if ( $. == 1 ) { @elem = split /,/, $line; next; }
 
    print "<row>\n";
    my @item = split /,/, $line;
    foreach my $i ( 0 .. $#elem ) {
        print "<$elem[$i]>$item[$i]</$elem[$i]>\n";
    }
    print "</row>\n";
}

data.csv

날짜,이름,구분,제조사,모델,과,팀
20100429,세벌,PC,삼성,DM-C200-PP12G,총무과,전산팀
20100501,두벌,PC,HP,HP-2342,총무과,관리팀

perl csv2xml.pl data.csv

<row>
<날짜>20100429</날짜>
<이름>세벌</이름>
<구분>PC</구분>
<제조사>삼성</제조사>
<모델>DM-C200-PP12G</모델>
<과>총무과</과>
<팀>전산팀</팀>
</row>
<row>
<날짜>20100501</날짜>
<이름>두벌</이름>
<구분>PC</구분>
<제조사>HP</제조사>
<모델>HP-2342</모델>
<과>총무과</과>
<팀>관리팀</팀>
</row>
세벌의 이미지

리눅스가 아니라서
http://www.activestate.com/activeperl/
에서 윈도용 perl 받아서 설치하고
perl 실행 시켰는데...
만들어진 파일을 파이어폭스에서 띄워보니

XML 변환기 에러: 부적합한 형식 위치: file:///D:/ttf/ex.xml 행 2, 글자 위치 2:<date>20100429</date>
-^

이런 에러가 나네요.
파이어폭스에서 문제의 소스를 보면
<row>
<date>20100429</date>
<이름>세벌</이름>
<구분>PC</구분>
<제조사>삼성</제조사>
<모델>DM-C200-PP12G</모델>
<과>총무과</과>
<팀>전산팀</팀>
</row>
<row>
 
<date>20100501</date>
<이름>두벌</이름>
<구분>PC</구분>
<제조사>HP</제조사>
<모델>HP-2342</모델>
<과>총무과</과>
<팀>관리팀</팀>
</row>

이렇게 제대로 된 것 같은데... 인코딩 문제일까요?
http://sebul.sarang.net/
aero의 이미지

윈도우즈에서 했다면 기본 인코딩이 cp949입니다.
csv파일 안의 한글이 cp949인데 xml출력은 utf8으로 하고 싶으시면

csv2xml.pl

#!/usr/bin/env perl
use strict;
use warnings;
use Encode 'from_to'; 
my @elem;
while ( my $line = <> ) {
    chomp $line;
    if ( $. == 1 ) { @elem = split /,/, $line; next; }
 
    print "<row>\n";
    my @item = split /,/, $line;
    foreach my $i ( 0 .. $#elem ) {
        my $str = "<$elem[$i]>$item[$i]</$elem[$i]>";
        from_to($str, 'cp949', 'utf8');
        print $str, "\n";
    }
    print "</row>\n";
}

로 고쳐서 해보세요.

csv내의 한글이 utf8이면 인코딩 변환이 필요없습니다.(원래 스크립트를 쓰면 됨)
그런데 에러가 났다면
xml encoding 관련 헤더 ( http://www.cadvance.org/?leftmenu=doc/include/total_menu.asp&mainpage=doc/xml/xml_doc/xml_encoding.asp )
를 적절하게 넣어보세요.

jg의 이미지

이상하게도 오류의 원인은 <`date> 이군요. xml을 잘 모르지만 "`" 문자 자체가 xml entry 이름으로 허용이 되나요?

$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}

aero의 이미지

위의 xml을 긁어보니 필드명 date 앞에 이상한 글자가 있는 것으로 봐서
BOM( http://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8_%EC%88%9C%EC%84%9C_%ED%91%9C%EC%8B%9D ) 이 있는 utf8 형식의
csv파일을 읽어서 그런 것 같네요.

소스의

if ( $. == 1 ) { @elem = split /,/, $line; next; }

if ( $. == 1 ) { $line =~ s/^\xEF\xBB\xBF//; @elem = split /,/, $line; next; }

로 고치고 해보세요.

그래도 안되면 필드명 date앞의 정체불명의 문자를 제거하시고 해보심이~

세벌의 이미지

xml 익히다가 BOM이라는 것도 알아야되다니... 이런게 있는 줄도 몰랐는데...

윈도에 기본으로 있는 메모장 utf-8 형식으로 저장하면 기본적으로 BOM 붙어서 생기는 문제 같네요. 근데 BOM 안들어가게 저장하려면 어떻게 하나요? 메모장에서는 선택의 여지 없이 그냥 BOM이 들어가나본데요...

http://sebul.sarang.net/

aero의 이미지

BOM의 목적이 아키텍쳐별로 big/little endian 에 따라 바이트순서를 알려주기 위한
목적인데 utf8은 바이트순서가 문제가 되지 않는 인코딩입니다만 MS는 어떤이유에선지
utf8에도 BOM을 넣습니다. 따라서 utf8 BOM을 넣지 않거나 삽입여부를 조정할 수 있는
vim, emacs등등의 전문 editor를 쓰시길 추천드립니다.

세벌의 이미지

덕분에 perl에 BOM에... 모르던 걸 많이 배우네요. aero님의 코드에 조금 덧붙인 perl 코드 올립니다.

#!/usr/bin/env perl
use strict;
use warnings;
 
my @elem;
 
print("<?xml version='1.0' encoding='utf-8'?>\n<list>\n");
 
while ( my $line = <> ) {
    chomp $line;
    if ( $. == 1 ) { $line =~ s/^\xEF\xBB\xBF//; @elem = split /,/, $line; next; }
 
    print "<row>\n";
    my @item = split /,/, $line;
    foreach my $i ( 0 .. $#elem ) {
        print "<$elem[$i]>$item[$i]</$elem[$i]>\n";
    }
    print "</row>\n";
}
print("</list>\n");

덧. 그런데 제가 올린 perl 코드는 검정색으로만 나오는데 aero님의 코드는 색깔이 알록달록(?)하게 나오네요. 이건 어떻게 하면 되는지? 또 하나의 궁금증이 생겼네요...

http://sebul.sarang.net/

lacovnk의 이미지

code 태그에 lang=perl을 추가해보세요

#!/usr/bin/env perl
use strict;
use warnings;
 
my @elem;
 
print("<?xml version='1.0' encoding='utf-8'?>\n<list>\n");
 
while ( my $line = <> ) {
    chomp $line;
    if ( $. == 1 ) { $line =~ s/^\xEF\xBB\xBF//; @elem = split /,/, $line; next; }
 
    print "<row>\n";
    my @item = split /,/, $line;
    foreach my $i ( 0 .. $#elem ) {
        print "<$elem[$i]>$item[$i]</$elem[$i]>\n";
    }
    print "</row>\n";
}
print("</list>\n");

댓글 달기

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