2010-01-06 2 views
3

데이터베이스의 테이블을 탭으로 구분 된 값 파일로 내 보내야합니다. Perl 및 SQL Plus에서 DBI를 사용하고 있습니다. 그것은 지원 (DBI 또는 SQL 플러스) 수출 및 또는 TSV 파일에서 가져 오기합니까?어떻게 탭으로 구분 된 값에 오라클 테이블을 내보낼 수 있습니까?

필요한 경우 코드를 작성할 수 있지만 사용할 수있는 경우 준비된 솔루션을 사용하고 싶습니다.

답변

2

탭으로 구분 된 값을 가진 파일에 테이블을 덤프하는 것은 비교적 간단해야합니다. 예를 들어

: 데이터가 탭이나 줄 바꿈 중 하나가 포함되어있는 경우이 잘 작동하지 않습니다

open(my $outputFile, '>', 'myTable.tsv'); 

my $sth = $dbh->prepare('SELECT * FROM myTable'); 

$sth->execute; 

while (my $row = $sth->fetchrow_arrayref) { 
    print $outputFile join("\t", @$row) . "\n"; 
} 

close $outputFile; 
$sth->finish; 

참고.

+1

일반적으로 모든 데이터 열에 포함 탭이 포함되지 않도록 구조적 파일을 생성하려면 원시 조인을 피하는 것이 가장 좋습니다. 문제를 방지하려면이 열 내부의 구분은 큰 따옴표로 포함되도록 텍스트 :: CSV_XS를 사용하는 것이 최선이 될 것입니다. 이 상황에 대해 올바르게 경고했습니다. Text :: CSV_XS를 사용하면 더 튼튼합니다. –

+1

데이터 중 탭 (이진 데이터 일 수도 있음)이 있으면 문제가 발생할 수 있습니다. Test :: CSV_XS를 사용하여 레코드를 생성 할 수 있습니다. –

1

제공된 정보에서 sqlplus에 대해 언급 한 DBI를 사용하여 Oracle 인스턴스에 연결하는 것으로 추측됩니다.

"준비된"솔루션을 원한다면 가장 좋은 방법은 "yasql"(또 다른 SQLplus) 인 oracle 용 DBD :: Oracle 기반 데이터베이스 쉘을 사용하는 것입니다.

yasql에는 sql select 문을 작성하고 출력을 해당 쉘에서 직접 CSV 파일로 리디렉션 할 수있는 멋진 기능이 있습니다 (Text :: CSV_XS가 필요함).

반면에 DBD::OracleText::CSV_XS으로 자신의 스크립트를 굴릴 수 있습니다. 당신의 문 핸들이 준비되고 실행되면, 당신이 할 필요가있다 :

$csv->print ($fh, $_) for @{$sth->fetchrow_array}; 

당신이 레코드 분리 등의 탭이 $의 CSV 초기화 한 가정. 자세한 내용은 Text::CSV_XS 문서를 참조하십시오.

0

필자는 이전에이 작업을 수행해야했습니다 ... 실행하려는 쿼리를 전달한 sqlplus를 통해 전달하는 펄 스크립트가 있습니다. | 사용자가 탭을 원하는 경우

물론
open(UNLOAD, "> $file");  # Open the unload file. 
$query =~ s/;$//;    # Remove any trailng semicolons. 
           # Build the sql statement. 
$cmd = "echo \"SET HEAD OFF 
      SET FEED OFF 
      SET COLSEP \| 
      SET LINES 32767 
      SET PAGES 0 
      $query; 
      exit; 
      \" |sqlplus -s $DB_U/$DB_P"; 

@array = `$cmd`;    # Execute the sql and store 
           # the returned data in "array". 
print $cmd . "\n"; 
clean(@array);    # Remove any non-necessary whitespace. 
           # This is a method to remove random non needed characters 
           # from the array 

foreach $x (@array)   # Print each line of the 
{        # array to the unload file. 
    print UNLOAD "$x\|\n"; 
} 

close UNLOAD;     # Close the unload file. 

내가 파이프를 만드는 중이라서 위는 ... 그냥 대신의의 \ t이 필요 delimeted : 여기 발췌입니다 인쇄에서.

0

다음은 awk 및 sqlplus와 관련된 접근 방법입니다. 당신은 awk 스크립트를 저장하거나 oneliner를 복사/붙이기를 사용할 수 있습니다. 필드가 clobbered되지 않도록 HTML 출력 모드를 사용합니다.

스토어 sqlplus2tsv.awk 등이 스크립트 :

긴 문자열과 이상한 문자로이를 테스트하지 않았 , 그것은 내 사용 사례에 근무

# This requires you to use the -M "HTML ON" option for sqlplus, eg: 
# sqlplus -S -M "HTML ON" [email protected] @script | awk -f sqlplus2tsv.awk 
# 
# You can also use the "set markup html on" command in your sql script 
# 
# Outputs tab delimited records, one per line, without column names. 
# Fields are URI encoded. 
# 
# You can also use the oneliner 
# awk '/^<tr/{l=f=""}/^<\/tr>/&&l{print l}/^<\/td>/{a=0}a{l=l$0}/^<td/{l=l f;f="\t";a=1}' 
# if you don't want to store a script file 

# Start of a record 
/^<tr/ { 
    l=f="" 
} 
# End of a record 
/^<\/tr>/ && l { 
    print l 
} 
# End of a field 
/^<\/td>/ { 
    a=0 
} 
# Field value 
# Not sure how multiline content is output 
a { 
    l=l $0 
} 
# Start of a field 
/^<td/ { 
    l=l f 
    f="\t" 
    a=1 
} 
. 진취적인 영혼은이 기술을 펄 래퍼에 적용 할 수 있습니다 :)

관련 문제