2017-07-18 83 views
-2

我有txt文件,其中包含數千個創建表語句。在記事本中刪除不需要的字符串++

例如一個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. 表名之後指定創建一個像CREATE TABLE dim_idi_rig_bkp_2016_07_31這裏dim_idi_rig_bkp_2016_07_31是表名在單引號TBALE字。
  2. 和最後一列名行格式SERDE字之前指定的燒毛報價像 ingestion_tsp時間戳) 行格式SERDE 這裏ingestion_tsp是最後一列名。
  3. 數據庫名稱在單引號位置字之後的行狀 位置 指定「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 

請注意,您的樣品具有特殊的引號(不是單引號)周圍的ID和我複製那些

+0

謝謝你的幫助 – user

相關問題