java - 从 .CSV 导入的 Oracle Sql 数据库中未显示数据

标签 java oracle csv web-scraping sql-loader

我抓取了一个网站并将数据提取到 .CSV 文件中。该流程已成功执行并正常运行。但是,当我尝试获取 Oracle Sql 数据库表中的数据时,它只获取 .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 和数据库结果的快照。

Oracle Sql Database Result

CSVfile result

最佳答案

您的 Java 代码使用换行符 (LF) 作为行分隔符:

            sb.append("\n");

这在 Linux/UNIX 世界中很好,但您的 Oracle 实例似乎在 Windows 上运行,并且默认情况下需要 Windows 样式的行分隔符,同时包含回车符和换行符 (CRLF)。

当它读取文件时,它会将 LF 本身视为行中的一个字符,因此它本质上将整个文件视为一行,正如 J.Chomel 之前建议的那样。

您可以使用实用程序转换行结尾,或者通过将代码更改为以下内容来生成具有预期 Windows 分隔符的文件:

            sb.append("\r\n");

关于java - 从 .CSV 导入的 Oracle Sql 数据库中未显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36762505/

相关文章:

oracle - 如何在 Go 语言中从 Oracle(长原始格式)读取图像

bash - 清理 csv 的 Sed 命令不起作用

python - MySQL `Load Data Infile Local` 对于 .csv 失败,除非我先打开并保存该文件。我怎样才能避免这一步?

python - Pandas:如何加载包含多个 txt 文件的 zip 文件?

java - 创建位图缩略图的ArrayList

java - 如何在 Java 中重构关闭流?

java - 使用OpenCV-3.1.0时,如何获取OpenCV-2x提供的 "Highgui.imencode()"的功能?

使用byte []在oracle中的java用户定义函数

java - 选择具有指定月份日期的所有行

java - 对于客户端/服务器拓扑来说,锁仍然是故障安全的吗?