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

时间:2018-07-10 19:34:35

标签: java string ctl

您好,我正在尝试读取读取的表名和列名以进行我的测试验证的SQL查询

我有一个.ctl文件,其文件内容如下所示

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)                                                                               
)                                                                               

我的要求是将表名读为字符串和列名,而忽略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();

			}
		}

	}

}

我可以使用Strings类读取表名,但无法获取列名。

我的Desire结果是将列名附加在字符串中,并以逗号分隔,如下所示

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 十进制 外部 NULLIF ALM_ VERS_ ID 空白 LAV_ 光盘 焦炭 NULLIF LAV_ 光盘 空白 LAV_ 光盘_ 证券交易所 整数 外部 NULLIF LAV_ 光盘_ 证券交易所 空白 LAV_ 光盘_ AMT 十进制 外部 NULLIF LAV_ 光盘_ AMT 空白 EXPRT_ DT 日期 YYYY MM DD DUA_ INSRT_ ID 焦炭 NULLIF DUA_ INSRT_ ID 空白 DUA_ INSRT_ TMSTP 时间戳 YYYY MM DD H MI SS FF DUA_ UPDT_ ID 焦炭 NULLIF DUA_ UPDT_ ID 空白 DUA_ UPDT_ TMSTP 时间戳 YYYY MM DD H MI SS FF DUA_ VERS_ 丁腈橡胶 十进制 外部 NULLIF DUA_ VERS_ 丁腈橡胶 空白

1 个答案:

答案 0 :(得分:1)

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

编码了一个控制文件解析器,用于处理表名,每个控制文件的所有列名。

https://github.com/ranjancse26/ControlFileProcessor

您可以轻松地将工程师代码从C#反向转换为Java。