数据未显示在 oracle Sql 从 .CSV 导入的数据库中
Data not showing in the oracle Sql Database importing from .CSV
我抓取了一个网站并将数据提取到 .CSV
文件中。此过程已成功执行并正常工作。但是,当我试图在 Oracle Sql 数据库的 table 中获取数据时,它只会带来 .CSV
文件的第一行,而不会检索数据的其他行。我正在尝试通过在创建脚本中编写的 SQLLoader
来检索 CSV 文件的数据。当我通过该脚本调用任何其他 CSV 时,它工作正常并带来所有数据。但是,这件事只出现在通过java程序创建的文件中。
Java代码如下
public static void parsingHTML() throws Exception {
for (int i = 1; i <= 1; i++) {
tbodyElements = doc.getElementsByTag("tbody");
if (tbodyElements.isEmpty()) {
throw new Exception("Table is not found");
}
elements = tbodyElements.get(0).getElementsByTag("tr");
for (Element trElement : elements) {
trElement2 = trElement.getElementsByTag("tr");
tdElements = trElement.getElementsByTag("td");
File fold = new File("C:\convertedCSV9.csv");
fold.delete();
File fnew = new File("C:\convertedCSV9.csv");
FileWriter sb = new FileWriter(fnew, true);
for (Iterator<Element> it = tdElements.iterator(); it.hasNext();) {
Element tdElement1 = it.next();
final String content2 = tdElement1.text();
if (it.hasNext()) {
sb.append("\n");
}
for (Iterator<Element> it2 = trElement2.iterator(); it.hasNext();) {
Element tdElement2 = it.next();
final String content = tdElement2.text();
if (it2.hasNext()) {
sb.append(formatData(content));
sb.append(" , ");
}
if (!it.hasNext()) {
String content1 = content.replaceAll(",$", " ");
sb.append(formatData(content1));
it2.next();
}
}
System.out.println(sb.toString());
sb.flush();
sb.close();
}
System.out.println(sampleList.add(tdElements));
}
}
}
创建脚本是
-- Create table
create table TEST_EXCEL_OPEN_END_SMRY
(
fund_name VARCHAR2(150),
rating VARCHAR2(50),
validity_date VARCHAR2(50),
fund_nav VARCHAR2(50),
ytd VARCHAR2(50),
mtd VARCHAR2(50),
day_1 VARCHAR2(50),
days_15 VARCHAR2(50),
days_30 VARCHAR2(50),
days_90 VARCHAR2(50),
days_180 VARCHAR2(50),
days_270 VARCHAR2(50),
days_365 VARCHAR2(50)
)
organization external
(
type ORACLE_LOADER
default directory DIR_KSE
access parameters
(
RECORDS DELIMITED BY NEWLINE
badfile bad_dir:'revext%a_%p.bad'
logfile log_dir:'revext%a_%p.log'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(
FUND_NAME,
RATING ,
VALIDITY_DATE ,
FUND_NAV ,
YTD ,
MTD ,
DAY_1 ,
DAYS_15 ,
DAYS_30 ,
DAYS_90 ,
DAYS_180,
DAYS_270,
DAYS_365
)
)
location (DIR_KSE:'convertedCSV9.csv')
)
reject limit UNLIMITED;
P.S: DIR_KSE
的路径是正确的。我还附上了 CSV 和数据库结果的快照。
您的 Java 代码使用换行符 (LF) 作为行分隔符:
sb.append("\n");
这在 Linux/UNIX 世界中很好,但您的 Oracle 实例似乎在 Windows 上 运行,并且默认情况下需要 Windows 样式的行分隔符,同时使用回车 return 和换行符 (CRLF)。
当它读取文件时,它自己将 LF 视为行中的一个字符,因此它基本上将整个文件视为一行,正如 J.Chomel 之前建议的那样。
您可以使用实用程序转换行结尾,或者通过将代码更改为:
来生成具有预期 Windows 分隔符的文件
sb.append("\r\n");
我抓取了一个网站并将数据提取到 .CSV
文件中。此过程已成功执行并正常工作。但是,当我试图在 Oracle Sql 数据库的 table 中获取数据时,它只会带来 .CSV
文件的第一行,而不会检索数据的其他行。我正在尝试通过在创建脚本中编写的 SQLLoader
来检索 CSV 文件的数据。当我通过该脚本调用任何其他 CSV 时,它工作正常并带来所有数据。但是,这件事只出现在通过java程序创建的文件中。
Java代码如下
public static void parsingHTML() throws Exception {
for (int i = 1; i <= 1; i++) {
tbodyElements = doc.getElementsByTag("tbody");
if (tbodyElements.isEmpty()) {
throw new Exception("Table is not found");
}
elements = tbodyElements.get(0).getElementsByTag("tr");
for (Element trElement : elements) {
trElement2 = trElement.getElementsByTag("tr");
tdElements = trElement.getElementsByTag("td");
File fold = new File("C:\convertedCSV9.csv");
fold.delete();
File fnew = new File("C:\convertedCSV9.csv");
FileWriter sb = new FileWriter(fnew, true);
for (Iterator<Element> it = tdElements.iterator(); it.hasNext();) {
Element tdElement1 = it.next();
final String content2 = tdElement1.text();
if (it.hasNext()) {
sb.append("\n");
}
for (Iterator<Element> it2 = trElement2.iterator(); it.hasNext();) {
Element tdElement2 = it.next();
final String content = tdElement2.text();
if (it2.hasNext()) {
sb.append(formatData(content));
sb.append(" , ");
}
if (!it.hasNext()) {
String content1 = content.replaceAll(",$", " ");
sb.append(formatData(content1));
it2.next();
}
}
System.out.println(sb.toString());
sb.flush();
sb.close();
}
System.out.println(sampleList.add(tdElements));
}
}
}
创建脚本是
-- Create table
create table TEST_EXCEL_OPEN_END_SMRY
(
fund_name VARCHAR2(150),
rating VARCHAR2(50),
validity_date VARCHAR2(50),
fund_nav VARCHAR2(50),
ytd VARCHAR2(50),
mtd VARCHAR2(50),
day_1 VARCHAR2(50),
days_15 VARCHAR2(50),
days_30 VARCHAR2(50),
days_90 VARCHAR2(50),
days_180 VARCHAR2(50),
days_270 VARCHAR2(50),
days_365 VARCHAR2(50)
)
organization external
(
type ORACLE_LOADER
default directory DIR_KSE
access parameters
(
RECORDS DELIMITED BY NEWLINE
badfile bad_dir:'revext%a_%p.bad'
logfile log_dir:'revext%a_%p.log'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(
FUND_NAME,
RATING ,
VALIDITY_DATE ,
FUND_NAV ,
YTD ,
MTD ,
DAY_1 ,
DAYS_15 ,
DAYS_30 ,
DAYS_90 ,
DAYS_180,
DAYS_270,
DAYS_365
)
)
location (DIR_KSE:'convertedCSV9.csv')
)
reject limit UNLIMITED;
P.S: DIR_KSE
的路径是正确的。我还附上了 CSV 和数据库结果的快照。
您的 Java 代码使用换行符 (LF) 作为行分隔符:
sb.append("\n");
这在 Linux/UNIX 世界中很好,但您的 Oracle 实例似乎在 Windows 上 运行,并且默认情况下需要 Windows 样式的行分隔符,同时使用回车 return 和换行符 (CRLF)。
当它读取文件时,它自己将 LF 视为行中的一个字符,因此它基本上将整个文件视为一行,正如 J.Chomel 之前建议的那样。
您可以使用实用程序转换行结尾,或者通过将代码更改为:
来生成具有预期 Windows 分隔符的文件 sb.append("\r\n");