从 Java 中的 .ctl 文件中读取 Table 名称和列名称

Read the Table Name and Column Names from .ctl file in Java

您好,我正在尝试阅读 table 名称和列名称,以供我的测试验证 sql 查询使用

我有一个 .ctl 文件,其中包含 table 详细信息,如图所示

LOAD DATA APPEND
  INTO TABLE ALM_LAV_CD_BSTG
FIELDS TERMINATED BY '~~' 
TRAILING NULLCOLS                                                               
(                                                                               
   ALM_VERS_ID                      DECIMAL EXTERNAL NULLIF (ALM_VERS_ID=BLANKS)
 , LAV_CD                           CHAR NULLIF (LAV_CD=BLANKS)                 
 , LAV_CD_OFSE                      INTEGER EXTERNAL NULLIF (LAV_CD_OFSE=BLANKS)
 , LAV_CD_AMT                       DECIMAL EXTERNAL NULLIF (LAV_CD_AMT=BLANKS) 
 , EXPRT_DT                         DATE "YYYY-MM-DD"
 , DUA_INSRT_ID                     CHAR NULLIF (DUA_INSRT_ID=BLANKS)           
 , DUA_INSRT_TMSTP                  TIMESTAMP "YYYY-MM-DD HH24:MI:SS.FF6"                                            
 , DUA_UPDT_ID                      CHAR NULLIF (DUA_UPDT_ID=BLANKS)            
 , DUA_UPDT_TMSTP                   TIMESTAMP "YYYY-MM-DD HH24:MI:SS.FF6"                                            
 , DUA_VERS_NBR                     DECIMAL EXTERNAL NULLIF (DUA_VERS_NBR=BLANKS)                                                                               
)                                                                               

我的要求是将 table 名称读入字符串,将忽略 EXPRT_DT 的列名读入字符串

我的代码如下

package com.cf.ODSAutomation;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.filechooser.FileNameExtensionFilter;

public class ReadControlFile {

 public static void main(String[] args) throws Exception {

  // Control Files Folder Path

  File path = new File("C:\ODS\control_File");
  final FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter("Control Files", "ctl");
  File[] files = path.listFiles();
  System.out.println("Number of Control Files : " + files.length);

  // Looping the files in the folder

  for (final File file : path.listFiles()) {
   if (extensionFilter.accept(file)) {
    System.out.println("File Name : " + file.getName().trim());
    BufferedReader reader = new BufferedReader(new FileReader(file));
    StringBuilder builder = new StringBuilder();
    String currentLine = reader.readLine();
    while (currentLine != null) {
     builder.append(currentLine);
     builder.append("\n");
     currentLine = reader.readLine();
    }

    // Appending all lines into single line
    System.out.println(builder.toString());

    // Getting Table Name
    String temp[] = builder.toString().split("TABLE ");
    String temp1[] = temp[1].split("_BSTG");
    String TableName = temp1[0].trim();
    System.out.println("Table Name : " + TableName);

    Pattern p = Pattern.compile("[a-zA-Z]+_*");

    Matcher m1 = p.matcher(temp[1]);

    System.out.println("Words from string \"" + temp[1] + "\" : ");
    while (m1.find()) {
     System.out.println(m1.group());
    }

    reader.close();

   }
  }

 }

}

我可以使用字符串 class 读取 table 名称,但无法获取列名称。

我的期望结果是将列名附加在一个字符串中,用逗号分隔,如下所示

ALM_VERS_ID , LAV_CD , LAV_CD_OFSE , LAV_CD_AMT, EXPRT_DT , DUA_INSRT_ID , DUA_INSRT_TMSTP, DUA_UPDT_ID, DUA_UPDT_TMSTP, DUA_VERS_NBR

目前我的结果是

ALM_ LAV_ 光盘_ BSTG 领域 终止 经过 尾随 空列 ALM_ VERS_ ID 十进制 外部的 零位 ALM_ VERS_ ID 空白 LAV_ 光盘 字符 零位 LAV_ 光盘 空白 LAV_ 光盘_ OFSE 整数 外部的 零位 LAV_ 光盘_ OFSE 空白 LAV_ 光盘_ AMT 十进制 外部的 零位 LAV_ 光盘_ AMT 空白 EXPRT_ DT 日期 年年年年 毫米 DD 杜阿_ INSRT_ ID 字符 零位 杜阿_ INSRT_ ID 空白 杜阿_ INSRT_ TMSTP 时间戳 年年年年 毫米 DD 哈 心率 党卫军 FF 杜阿_ 更新_ ID 字符 零位 杜阿_ 更新_ ID 空白 杜阿_ 更新_ TMSTP 时间戳 年年年年 毫米 DD 哈 心率 党卫军 FF 杜阿_ VERS_ 丁腈橡胶 十进制 外部的 零位 杜阿_ VERS_ 丁腈橡胶 空白

请查看我为您编写的用于处理控制文件的 C# 解决方案。我碰巧用*.txt命名了控制文件。

编码控制文件解析器以处理 table 名称,每个控制文件的所有列名称。

https://github.com/ranjancse26/ControlFileProcessor

您可以轻松地将 C# 代码逆向为 Java。