从.CSV导入的oracle Sql数据库中未显示数据

时间:2016-04-21 07:22:31

标签: java oracle csv web-scraping sql-loader

我抓取了一个网站并将数据提取到.CSV文件中。此过程已成功执行并正常运行。但是,当我尝试获取Oracle Sql Database表中的数据时,它只会带来.CSV文件的第一行,而不会检索其他数据行。我试图通过在create script中编写的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

1 个答案:

答案 0 :(得分:3)

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

            sb.append("\n");

在Linux / UNIX世界中这很好,但看起来你的Oracle实例在Windows上运行,并且默认情况下需要Windows样式的行分隔符,包括回车符和换行符(CRLF)。

当它读取文件时,它会将LF视为行中的一个字符,因此它基本上将整个文件看作一行,如J.Chomel先前所建议的那样。

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

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