从 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。
您好,我正在尝试阅读 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。