2017-07-18 20 views
-2

何千ものcreate table文を含むtxtファイルがあります。 1 CREATE TABLE文例えば不要な文字列をメモ帳で削除する++

は以下の通りです:

CREATE TABLE `dim_idi_rig_bkp_2016_07_31`(
    `id` double, 
    `name` string, 
    `type` string, 
    `description` string, 
    `elid` string, 
    `ingestion_tsp` timestamp) 
ROW FORMAT SERDE 
    'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
STORED AS INPUTFORMAT 
    'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION 
    'hdfs://namesvc/landing/hive/warehouse/dr/lz_data_backup_store.db/dim_idi_rig_bkp_2016_07_31' 
TBLPROPERTIES (
    'COLUMN_STATS_ACCURATE'='true', 
    'numFiles'='1', 
    'numRows'='5111', 
    'rawDataSize'='303830', 
    'totalSize'='308941', 
    'transient_lastDdlTime'='1470114511') 

私は、テーブル名とそこに最後の列名とデータベース名を取得しようとしています。

  1. テーブル名がここにdim_idi_rig_bkp_2016_07_31 TABLE dim_idi_rig_bkp_2016_07_31をCREATEテーブル名であるように単一引用符でTBALE単語を作成した後に指定されています。ここ
  2. と最後の列名は ingestion_tspタイムスタンプのような焦がすの引用に行形式のSERDEワードの前に指定されている) 行形式のSERDE ingestion_tsp最後の列名です。
  3. データベース名は LOCATION のような単一引用符でLOCATIONワードの後の行に指定されている「HDFS://namesvc/landing/hive/warehouse/dr/lz_data_backup_store.db/dim_idi_rig_bkp_2016_07_31」 はここlz_data_backup_storeデータベース名です。

ので、後の私の願望出力リストはどのように我々は正規表現を経由してこれを達成することができ++メモ帳でこの

<table_name> <last_column_name> <database_name> 

のようになります。すべての不要な文字列を削除します。このため

+0

私はこれを試しました。* word1(?s:。*?))Word2。*しかし、これでテーブル名を取得できます... – user

+0

これは仕事ではありませんNpp、あなたはあなたの好きなスクリプト言語でスクリプトを書くべきです。 – Toto

+0

そのJavaで難しい..あなたが助けることができる – user

答えて

0
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TestT { 

public static void main(String[] args) throws IOException { 
    //for reading create statements from file 
    FileReader fileReader = new FileReader("C:/Users/asoni5/Desktop/demo.txt"); 
    String fileContents = ""; 
    int i ; 
    while((i = fileReader.read())!=-1){ 
    char ch = (char)i; 
    fileContents = fileContents + ch; 
    } 

// System.out.println(fileContents); 
    //regrex 
    final String regex = "(?s)CREATE TABLE `([^`]+)`\\s*\\([^)]*`([^`]+)`\\s+\\w+\\)\\s*ROW FORMAT SERDE(?:(?!CREATE TABLE).)*?\\nLOCATION\\R\\s*'(?-s:.*?)([^\\n/]+)\\.db(?:(?!CREATE TABLE).)*"; 
    final String subst = "$1\t$2\t$3\n"; 

    final Pattern pattern = Pattern.compile(regex); 
    final Matcher matcher = pattern.matcher(fileContents); 

    // The substituted value will be contained in the result variable 
    final String result = matcher.replaceAll(subst); 
//write the result in file 
    System.out.println(result); 
    File file = new File("C:/Users/asoni5/Desktop/filename.txt"); 
    FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
    BufferedWriter bw = new BufferedWriter(fw); 
    bw.write(result); 
    bw.close(); 
} 
} 
+0

ありがとうございます – user

0

検索:

CREATE TABLE `(.+?)`.+?(?:\s*`[^`]+`.+\r\n)+\s+`(.+?)`.+?\)\r\nROW FORMAT SERDE(?:.|\r\n)+?LOCATION\s+'(.+?)'\s+?TBLPROPERTIES \([^)]+\)\s* 

、これですべて置き換えます。

\1,\2,\3\r\n 

注あなたのサンプルは、IDSの周りに独特の引用符(ない単一引用符を)持っていたことを、私は中にそれらをコピーし

+0

ご協力いただきありがとうございます – user

関連する問題