質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

1回答

525閲覧

awk「CREATE TABLE」文ごとにファイルに出力

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

1クリップ

投稿2020/08/05 10:16

編集2020/08/05 13:53
CREATE TABLE_A{ ・・・・・・ ・・・・・・ } CREATE TABLE_B{ ・・・・・・ ・・・・・・ } CREATE TABLE_C{ ・・・・・・ ・・・・・・ }

上記のように複数の「CREATE TABLE」文があり、一回の処理でテーブルごとに
ファイルに出力(ファイル名はそれぞれのテーーブル名)するにはどうしたら良いのでしょうか。
下記が例です。
※LINUX環境

---------------------------------TABLE_A.txt----------------------------- CREATE TABLE_A{ ・・・・・・ ・・・・・・ }
---------------------------------TABLE_B.txt----------------------------- CREATE TABLE_B{ ・・・・・・ ・・・・・・ }
---------------------------------TABLE_C.txt----------------------------- CREATE TABLE_C{ ・・・・・・ ・・・・・・ }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yasumichi

2020/08/05 13:26

念のため、使用環境を追記していただけますか?
退会済みユーザー

退会済みユーザー

2020/08/05 13:38

すみません、LINUXです。
Yasumichi

2020/08/05 13:46

perl などで複数行にまたがってマッチ可能な正規表現を作成して、処理していけば可能だとは思いますが、ちょっと検討してみます。
退会済みユーザー

退会済みユーザー

2020/08/05 13:49

ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/08/05 13:51

大変失礼ですが、awkを希望します。 可能であればでよろしいのでよろしくお願いします。
dodox86

2020/08/05 14:05

元のCREATE TABLE ...文が羅列されたファイルの仕様が不明確ですが、一般的なSQLではないのですか? {}で括られているようですが。末端も特に';'などで終わってはいないように思えます。
Daregada

2020/08/05 14:51

そろそろ、「なぜawkでやらないとダメなのか」を答えてくれてもいいかと思うが。
Daregada

2020/08/06 14:56

結局彼は何をしていたんだろう……ネットワークにも繋がっていない古いUNIXマシン(perlも入っていない)で変換しないといけなくなったとか?
guest

回答1

0

awk 希望とのことですが、とりあえず、perl 版で。

まずは、例通り CREATE TABLE テーブル名 ではなく CREATE テーブル名になっている場合の div_sql.pl です。

perl

1#!/usr/bin/perl 2 3use strict; 4 5my $file = shift; 6 7open my $fh, $file; 8my $content = do { local $/; <$fh> }; 9 10while ($content =~ /(CREATE ([^\{]*)\{[^\}]*\}\n*)/gm) { 11 open(DATAFILE, "> $2.txt"); 12 print DATAFILE $1; 13 close(DATAFILE); 14}

CREATE TABLE テーブル名 であれば、次のようにします。

perl

1#!/usr/bin/perl 2 3use strict; 4 5my $file = shift; 6 7open my $fh, $file; 8my $content = do { local $/; <$fh> }; 9 10while ($content =~ /(CREATE TABLE ([^\{]*)\{[^\}]*\}\n*)/gm) { 11 open(DATAFILE, "> $2.txt"); 12 print DATAFILE $1; 13 close(DATAFILE); 14}

ただし、CREATE 文の最後に ; がなく、 } の次が改行になっているという前提で書いているのでその辺は、状況に合わせて修正が必要です。

実行方法は、分割対象が test.sql である場合、以下のようになります。

perl div_sql.pl test.sql

※現状のままだとテーブル名と { の間に空白がある場合は抽出しません。

投稿2020/08/05 14:26

編集2020/08/05 14:30
Yasumichi

総合スコア1773

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問